Необходимо включить столбцы кластеризованного индекса в некластеризованные индексы?

15

Учитывая, что некластеризованный индекс основан на кластеризованном индексе, необходимо ли для некластеризованного индекса перечислять какие-либо столбцы, содержащиеся в кластерном индексе?

Другими словами, если таблица «Продукты» содержит кластеризованный индекс по ProductID, при создании некластеризованного индекса, в который целесообразно включить столбец «ProductID», необходимо ли, тем не менее, добавлять его в качестве столбца?

Если нет, есть ли сценарии, в которых было бы хорошо добавить имя столбца в некластеризованный индекс?

Нико
источник

Ответы:

20

В SQL Server столбцы ключа кластеризованного индекса всегда добавляются в некластеризованный индекс, чтобы действовать в качестве локатора строк (см .: Больше о ключах некластеризованного индекса ).

Для NCI, объявленного как уникальный, они добавляются как включенный столбец, в противном случае они добавляются в конец ключа.

Возможно, вы захотите добавить столбцы явно, если размещение по умолчанию не является оптимальным для ваших запросов. Например, если вы хотите контролировать направление ASC/ DESCили вы хотите контролировать положение ключевых столбцов в индексе.

CREATE TABLE T
(
A INT,
B INT,
C INT ,
PRIMARY KEY CLUSTERED (B DESC, C DESC)
)

/*Implicitly adds B DESC, C DESC to end of key*/
CREATE NONCLUSTERED INDEX ix1 ON T(A ASC) 

/*No sort operation*/
SELECT  *
FROM T
ORDER BY A ASC,B DESC, C DESC

/*
But the avove index won't be able to seek into A,C  
and will need a residual predicate after seeking into A.

For the following query
*/

SELECT  *
FROM T
WHERE A=1 AND C > 4
ORDER BY C ASC, B DESC

/*This index explicitly controlling the key column position 
  and direction would be better*/
CREATE NONCLUSTERED INDEX ix2 ON T(A ASC, C ASC, B DESC) 
Мартин Смит
источник