Ma to znaczenie przede wszystkim w przypadku użycia z indeksami złożonymi:
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 pojedynczej kolumnie może być efektywnie wykorzystany do sortowania na dwa sposoby.
Zobacz artykuł na moim blogu, aby uzyskać szczegółowe informacje:
- Zstępujące indeksy
Aktualizacja:
W rzeczywistości może to mieć znaczenie nawet dla indeksu pojedynczej kolumny, choć nie jest to takie oczywiste.
Wyobraź sobie indeks w kolumnie tabeli zgrupowanej:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Indeks w col1
przechowuje uporządkowane wartości col1
wraz z odniesieniami do wierszy.
Ponieważ tabela jest zgrupowana, odniesienia do wierszy są w rzeczywistości wartościami pk
. Są one również uporządkowane w ramach każdej wartości col1
.
Oznacza to, że liście indeksu są w rzeczywistości uporządkowane według (col1, pk)
i 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)
, a następnie wartości col1
zostaną posortowane malejąco, ale wartości pk
w każdej wartości col1
zostaną posortowane 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, które tworzą CLUSTERED INDEX
w dowolnej tabeli są zawsze końcowe kolumny dowolnego innego indeksu w tej tabeli.