Това преди всичко има значение, когато се използва със съставни индекси:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
може да се използва за едно от двете:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
или:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, но не и за:
SELECT *
FROM mytable
ORDER BY
col1, col2
Индекс на една колона може ефективно да се използва за сортиране и по двата начина.
Вижте статията в моя блог за подробности:
- Низходящи индекси
Актуализация:
Всъщност това може да има значение дори за един индекс на колона, макар че не е толкова очевидно.
Представете си индекс върху колона от клъстерирана таблица:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Индексът на col1
запазва подредените стойности на col1
заедно с препратките към редове.
Тъй като таблицата е групирана, препратките към редовете всъщност са стойностите на pk
. Те също са подредени във всяка стойност на col1
.
Това означава, че листата на индекса всъщност са подредени на (col1, pk)
, и тази заявка:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
не се нуждае от сортиране.
Ако създадем индекса, както следва:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, след това стойностите на col1
ще бъдат сортирани низходящо, но стойностите на pk
във всяка стойност на col1
ще бъдат сортирани възходящо.
Това означава, че следната заявка:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
може да се обслужва от ix_mytable_col1_desc
но не и от ix_mytable_col1
.
С други думи, колоните, които съставляват CLUSTERED INDEX
във всяка таблица винаги са крайните колони на всеки друг индекс в тази таблица.