Это особенно важно при использовании с составными индексами:
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
в любой таблице, всегда являются конечными столбцами любого другого индекса в этой таблице.