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.