495 votes

Pourquoi utiliser le INCLURE la clause lors de la création d'un index?

Tout en étudiant pour la 70-433 examen j'ai remarqué que vous pouvez créer un index de couverture dans l'une des deux façons suivantes.

CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)

-- OU --

CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)

La figure la clause est nouveau pour moi. Pourquoi l'utiliser et quelles seraient vos suggestions pour déterminer si pour créer un index de couverture avec ou sans l'INCLURE la clause?

430voto

gbn Points 197263

Si la colonne n'est pas dans l'emplacement de/PARTICIPER/du GROUPE/de l'ORDRE, mais seulement dans la liste des colonnes de la clause SELECT.

La figure la clause d'ajouter les données au plus bas/niveau feuille, plutôt que dans l'arbre d'index. Cet indice est petit, car il ne fait pas partie de l'arbre

Cela signifie qu'il n'est pas vraiment utile pour les prédicats, tri, etc comme je l'ai mentionné ci-dessus. Cependant, il peut être utile si vous avez un résiduel de recherche en quelques lignes de la colonne de clé(s)

Un autre article MSDN avec un exemple

243voto

marc_s Points 321990

Vous utilisez l'INCLURE pour ajouter une ou plusieurs colonnes à niveau de la feuille d'un index non-cluster, si ce faisant, vous pouvez couvrir vos requêtes.

Imaginez que vous ayez besoin d'effectuer des requêtes pour un ID d'employé, ministère de l'ID, et lastname.

SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5

Si vous avez un index non-cluster (Employé, DepartmentID), une fois que vous trouver les employés pour un département donné, vous avez maintenant à faire "recherche de signet" pour obtenir la pleine réelle enregistrement de l'employé, juste pour obtenir le nom de la colonne. Qui peut être assez coûteux en termes de performances, si vous trouvez un grand nombre de salariés.

Si vous aviez compris que le nom dans l'index:

CREATE NONCLUSTERED INDEX NC_EmpDep 
  ON Employee(EmployeeID, DepartmentID)
  INCLUDE (Lastname)

alors toutes les informations dont vous avez besoin est disponible au niveau de la feuille de l'index non cluster. Juste en cherchant dans l'index non cluster et de trouver vos employés pour un département donné, vous avez toutes les informations nécessaires, et la recherche de signet pour chaque employé dans l'index n'est plus nécessaire --> vous économisez beaucoup de temps.

Évidemment, vous ne pouvez pas inclure chaque colonne, dans chaque index non-cluster - mais si vous avez des requêtes qui sont en manque juste une ou deux colonnes d'être "couvert" (et qui a beaucoup), il peut être très utile d'INCLURE dans un adapté index non ordonné en clusters.

Marc

19voto

onupdatecascade Points 2049

L'indice de base des colonnes sont triées, mais inclus les colonnes ne sont pas triés. Cela permet d'économiser des ressources dans la gestion de l'index, tout en continuant à faire il possible pour fournir les données dans les colonnes incluses pour couvrir une requête. Donc, si vous voulez couvrir les requêtes, vous pouvez mettre les critères de recherche pour rechercher des lignes dans les colonnes triées de l'indice, mais alors "inclure" supplémentaires, des ménagères de colonnes avec les données de recherche. Il aide vraiment à réduire la quantité de tri et de la fragmentation dans la maintenance des index.

7voto

mrdenny Points 3359

Les raisons pour lesquelles (y compris les données au niveau de la feuille de l'index) ont été bien expliqué. La raison que vous donnez deux shakes à ce sujet, est que lorsque vous exécutez votre requête, si vous n'avez pas les colonnes supplémentaires inclus (nouvelle fonctionnalité de SQL 2005) SQL Server doit aller à l'index cluster pour obtenir les colonnes supplémentaires qui prend plus de temps, et ajoute plus de charge pour le service SQL Server, les disques et la mémoire (mémoire tampon pour être précis) que de nouvelles pages de données sont chargées en mémoire, peut-être en poussant plus souvent nécessaire les données du cache mémoire.

3voto

Kermit Points 23720

J'ai couru un test pour voir si il y aurait des différences entre l'utilisation de l'inclure dans un index avec 28 GO de table qui a eu 33094359 million de lignes. Chaque requête a retourné 46479 lignes.

Requête

SELECT id1, id2, MAX(desc1), COUNT(id1), MAX(col1) FROM table1
WITH (INDEX(index1))  
WHERE date1 >= DATEADD(mm, -6, GETDATE())
GROUP BY id1, id2

Indice 1

CREATE INDEX [index1]
ON [table1] ([date1], [id1], [id2])

L'index ci-dessus a pris 6229736 KO et exécution d'une requête avec l'forcé index dans 629161 mme.

Indice 2

CREATE INDEX [index2]
ON [table1] ([date1])
INCLUDE ([id1], [id2])

L'index ci-dessus a pris 6215496 KO et exécution d'une requête avec l'forcé index dans 624089 mme.

Les deux indices analysés 22959357 lignes (70% de l'ensemble de la table). Les résultats sont négligeables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X