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 col1
zachowuje uporządkowane wartości col1
wraz 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 col1
będą sortowane malejąco, ale wartości w pk
ramach każdej wartości col1
bę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_desc
ale nie przez ix_mytable_col1
.
Innymi słowy, kolumny stanowiące a CLUSTERED INDEX
w dowolnej tabeli są zawsze kolumnami końcowymi dowolnego innego indeksu w tej tabeli.