Nécessaire pour inclure des colonnes d'index cluster dans les index non cluster?

15

Étant donné qu'un index non clusterisé est basé sur l'index clusterisé, serait-il nécessaire que l'index non clusterisé répertorie l'une des colonnes contenues dans l'index clusterisé?

En d'autres termes, si la table Products contient un index cluster sur ProductID, lors de la création d'un index non cluster où il serait souhaitable d'inclure la colonne ProductID, est-il nécessaire de l'ajouter néanmoins en tant que colonne?

Sinon, existe-t-il des scénarios dans lesquels il serait bon d'ajouter le nom de la colonne à l'index non cluster?

Nico
la source

Réponses:

20

Dans SQL Server, les colonnes de clé d'index cluster sont toujours ajoutées à l'index non cluster pour agir comme un localisateur de lignes (Réf: En savoir plus sur les clés d'index non cluster ).

Pour un NCI déclaré comme unique, ils sont ajoutés en tant que colonne incluse, sinon ils sont ajoutés à la fin de la clé.

Vous souhaiterez peut-être ajouter les colonnes explicitement si l'emplacement par défaut n'est pas optimal pour vos requêtes. Par exemple, si vous souhaitez contrôler la direction ASC/ DESCou si vous souhaitez contrôler la position des colonnes clés dans l'index.

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) 
Martin Smith
la source