В первую очередь это имеет значение при использовании составных индексов:
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)
Индекс on 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
.
Другими словами, столбцы, составляющие a CLUSTERED INDEX
в любой таблице, всегда являются конечными столбцами любого другого индекса в этой таблице.