Les colonnes de clé d'index font partie du b-tree de l'index. Les colonnes incluses ne le sont pas.
Prenez deux index :
CREATE INDEX index1 ON table1 (col1, col2, col3)
CREATE INDEX index2 ON table1 (col1) INCLUDE (col2, col3)
index1
convient mieux à ce type de requête :
SELECT * FROM table1 WHERE col1 = x AND col2 = y AND col3 = z
Alors que index2
convient mieux à ce type de requête :
SELECT col2, col3 FROM table1 WHERE col1 = x
Dans la première requête, index1
fournit un mécanisme pour identifier rapidement les lignes d'intérêt. La requête s'exécutera (probablement) comme une recherche d'index, suivie d'une recherche de signet pour récupérer la ou les lignes complètes.
Dans la deuxième requête, index2
agit comme un indice de couverture. SQL Server n'a pas du tout besoin d'accéder à la table de base, car l'index fournit toutes les données dont il a besoin pour satisfaire la requête. index1
pourrait également servir d'indice de couverture dans ce cas.
Si vous voulez un index de couverture, mais que vous ne voulez pas ajouter toutes les colonnes au b-tree parce que vous ne les recherchez pas, ou ne pouvez pas parce qu'elles ne sont pas un type de données autorisé (par exemple, XML), utilisez le Clause INCLUDE.