Ma to znaczenie przede wszystkim w przypadku korzystania z indeksów złożonych:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
może być używany do:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
lub:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, ale nie dla:
SELECT *
FROM mytable
ORDER BY
col1, col2
Indeks w jednej kolumnie może być efektywnie używany do sortowania na oba sposoby.
Zobacz artykuł na moim blogu, aby uzyskać szczegółowe informacje:
Aktualizacja:
W rzeczywistości może to mieć znaczenie nawet dla indeksu pojedynczej kolumny, chociaż nie jest to takie oczywiste.
Wyobraź sobie indeks w kolumnie tabeli grupowanej:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Indeks na col1zachowuje uporządkowane wartości col1wraz z odwołaniami do wierszy.
Ponieważ tabela jest zgrupowana, odniesienia do wierszy są w rzeczywistości wartościami pk. Są również uporządkowane w ramach każdej wartości col1.
Oznacza to, że liście indeksu są faktycznie uporządkowane według (col1, pk), a to zapytanie:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
nie wymaga sortowania.
Jeśli utworzymy indeks w następujący sposób:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, wtedy wartości col1będą sortowane malejąco, ale wartości w pkramach każdej wartości col1będą sortowane rosnąco.
Oznacza to, że następujące zapytanie:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
może być obsługiwany przez, ix_mytable_col1_descale nie przez ix_mytable_col1.
Innymi słowy, kolumny stanowiące a CLUSTERED INDEXw dowolnej tabeli są zawsze kolumnami końcowymi dowolnego innego indeksu w tej tabeli.