Це в першу чергу має значення при використанні складених індексів:
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
з будь-якої таблиці, завжди є кінцевими стовпцями будь-якого іншого індексу цієї таблиці.