SQL Server ma coś, co nazywa się „statystyką wielokolumnową”, ale nie jest tak, jak mogłoby się wydawać.
Rzućmy okiem na poniższą przykładową tabelę:
CREATE TABLE BadStatistics
(
IsArchived BIT NOT NULL,
Id INT NOT NULL IDENTITY PRIMARY KEY,
Mystery VARCHAR(200) NOT NULL
);
CREATE NONCLUSTERED INDEX BadIndex
ON BadStatistics (IsArchived, Mystery);
Dzięki temu tworzone są dwie statystyki dotyczące dwóch indeksów:
Statystyki dla BadIndex:
+--------------+----------------+-------------------------+
| All density | Average Length | Columns |
+--------------+----------------+-------------------------+
| 0.5 | 1 | IsArchived |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 37 | IsArchived, Mystery |
+--------------+----------------+-------------------------+
| 4.149378E-06 | 41 | IsArchived, Mystery, Id |
+--------------+----------------+-------------------------+
+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 0 | 0 | 24398 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
| 1 | 0 | 216602 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
Statystyki dla indeksu klastrowego:
+--------------+----------------+---------+
| All density | Average Length | Columns |
+--------------+----------------+---------+
| 4.149378E-06 | 4 | Id |
+--------------+----------------+---------+
+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
| 1 | 0 | 1 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
| 240999 | 240997 | 1 | 240997 | 1 |
+--------------+------------+---------+---------------------+----------------+
| 241000 | 0 | 1 | 0 | 1 |
+--------------+------------+---------+---------------------+----------------+
(Wypełniłem tabelę losowymi danymi przykładowymi, w których około jedna dziesiąta wierszy nie jest zarchiwizowana. Następnie przeprowadziłem aktualizację statystyk pełnego skanowania).
Dlaczego histogram statystyk dwukolumnowych używa tylko jednej kolumny? Wiem, że wiele osób pisało o to, że nie , ale co to uzasadnienie? W takim przypadku cały histogram jest o wiele mniej przydatny, ponieważ pierwsza kolumna ma tylko dwie wartości. Dlaczego statystyki byłyby tak arbitralnie ograniczone?
Pamiętaj, że to pytanie nie dotyczy wielowymiarowych histogramów, które są zupełnie inną bestią. Chodzi o jednowymiarowe histogramy, przy czym jeden wymiar jest krotkami zawierającymi odpowiednie, wiele kolumn.