web-dev-qa-db-fra.com

Que sont les index et les requêtes couverts dans SQL Server?

Pouvez-vous expliquer les concepts et les relations entre les index de couverture et les requêtes couvertes dans SQL Server de Microsoft?

49
TheVillageIdiot

Un index de couverture est un index qui peut satisfaire toutes les colonnes demandées dans une requête sans effectuer une recherche supplémentaire dans l'index clusterisé.

Il n'y a pas de requête de couverture.

Jetez un œil à cet article de Simple-Talk: tilisation des index de couverture pour améliorer les performances des requêtes .

44
Mitch Wheat

Si toutes les colonnes demandées dans la liste de requête select, sont disponibles dans l'index , le moteur de requête n'a pas à rechercher à nouveau la table, ce qui peut augmenter considérablement les performances de la requête. Étant donné que toutes les colonnes demandées sont disponibles avec dans l'index, l'index couvre la requête. Ainsi, la requête est appelée une requête de couverture et l'index est un index de couverture.

Un index clusterisé peut toujours couvrir une requête, si les colonnes de la liste de sélection proviennent de la même table.

Les liens suivants peuvent être utiles si vous débutez avec les concepts d'indexation:

27
Suresh

Un indice de couverture est un Non-Clustered index. Les index clusterisés et non clusterisés utilisent la structure de données de l'arbre B pour améliorer la recherche de données, la différence est que dans les feuilles d'un index clusterisé, un enregistrement entier (c'est-à-dire une ligne) est stocké physiquement juste là!, Mais ce n'est pas le cas pour les index non clusterisés. Les exemples suivants l'illustrent:

Exemple: J'ai une table avec trois colonnes: ID, Fname et Lname.

enter image description here

Cependant, pour un index non clusterisé, il existe deux possibilités: soit la table a déjà un index clusterisé, soit elle n'en a pas:

enter image description here

Comme le montrent les deux diagrammes, ces index non clusterisés ne fournissent pas de bonnes performances, car ils ne peuvent pas trouver la valeur préférée (c'est-à-dire Lname) uniquement à partir de l'arbre B. Au lieu de cela, ils doivent effectuer une étape de recherche supplémentaire (recherche de clé ou RID) pour trouver la valeur de Lname. Et, c'est là que l'index couvert apparaît à l'écran. Ici, l'index Non Clustered sur ID couvre la valeur de Lname juste à côté de lui dans le feuilles de l'arbre B et il n'y a plus besoin d'aucun type de recherche.

enter image description here

16
TheEsnSiavashi

A requête couverte est une requête dans laquelle toutes les colonnes de l'ensemble de résultats de la requête sont extraites d'index non clusterisés.

Une requête est transformée en une requête couverte par la disposition judicieuse des index.

Une requête couverte est souvent plus performante qu'une requête non couverte en partie parce que les index non cluster ont plus de lignes par page que les index cluster ou les index de tas, donc moins de pages doivent être mises en mémoire afin de satisfaire la requête. Ils ont plus de lignes par page car seule une partie de la ligne du tableau fait partie de la ligne d'index.

Un indice de couverture est un index utilisé dans une requête couverte. Un indice qui n'existe pas en soi est un indice couvrant. Un index peut être un index de couverture par rapport à la requête A, tout en n'étant pas en même temps un index de couverture par rapport à la requête B.

9
yfeldblum

Voici n article sur devx.com qui dit:

Création d'un index non cluster qui contient toutes les colonnes utilisées dans une requête SQL, une technique appelée couvrant l'index

Je ne peux que supposer qu'une requête couverte est une requête qui a un index qui couvre toutes les colonnes de son jeu d'enregistrements renvoyé. Une mise en garde - l'index et la requête devraient être construits de manière à permettre au serveur SQL de déduire de la requête que l'index est utile.

Par exemple, une jointure d'une table sur elle-même peut ne pas bénéficier d'un tel index (selon l'intelligence du planificateur d'exécution de requête SQL):

PersonID ParentID Name
1        NULL     Abe
2        NULL     Bob
3        1        Carl
4        2        Dave

Supposons qu'il existe un index sur PersonID,ParentID,Name - ce serait un index de couverture pour une requête comme:

SELECT PersonID, ParentID, Name FROM MyTable

Mais une requête comme celle-ci:

SELECT PersonID, Name FROM MyTable LEFT JOIN MyTable T ON T.PersonID=MyTable.ParentID

Cela ne serait probablement pas si bénéfique, même si toutes les colonnes sont dans l'index. Pourquoi? Parce que vous ne lui dites pas vraiment que vous voulez utiliser le triple index de PersonID,ParentID,Name.

Au lieu de cela, vous créez une condition basée sur deux colonnes - PersonID et ParentID (qui exclut Name), puis vous demandez tous les enregistrements, avec le colonnes PersonID, Name. En fait, selon la mise en œuvre, l'index pourrait aider la dernière partie. Mais pour la première partie, vous feriez mieux d'avoir d'autres index.

6
Shalom Craimer

un index de couverture est celui qui donne toutes les colonnes requises et dans lequel le serveur SQL n'a pas à revenir à l'index cluster pour trouver une colonne. Ceci est réalisé en utilisant un index non clusterisé et en utilisant l'option INCLUDE pour couvrir les colonnes. Les colonnes non clés ne peuvent être incluses que dans des index non clusterisés. Les colonnes ne peuvent pas être définies à la fois dans la colonne clé et dans la liste INCLUDE. Les noms de colonne ne peuvent pas être répétés dans la liste INCLUDE. Les colonnes non clés ne peuvent être supprimées d'une table qu'après que l'index non clé a été supprimé en premier. Veuillez voir les détails ici

2
Sadia Aziz

Une requête de couverture indique où tous les prédicats peuvent être mis en correspondance à l'aide des indices des tables sous-jacentes.

Il s'agit de la première étape vers l'amélioration des performances du sql considéré.

2
Learning

Quand je me suis simplement souvenu qu'un index clusterisé se composait d'une liste non-tas ordonnée par clé de TOUTES les colonnes de la table définie, les lumières se sont allumées pour moi. Le mot "cluster" fait donc référence au fait qu'il existe un "cluster" de toutes les colonnes, comme un groupe de poissons dans ce "point chaud". S'il n'y a pas d'index couvrant la colonne contenant la valeur recherchée (le côté droit de l'équation), le plan d'exécution utilise une recherche d'index clusterisé dans la représentation de la colonne demandée par l'index cluster car il ne trouve la colonne demandée dans aucune autre indice "couvrant". Le manquant entraînera un opérateur de recherche d'index clusterisé dans le plan d'exécution proposé, où la valeur recherchée se trouve dans une colonne à l'intérieur de la liste ordonnée représentée par l'index clusterisé.

Ainsi, une solution consiste à créer un index non cluster qui a la colonne contenant la valeur demandée à l'intérieur de l'index. De cette façon, il n'est pas nécessaire de référencer l'index clusterisé, et l'optimiseur doit pouvoir accrocher cet index dans le plan d'exécution sans aucune indication. Si, cependant, il existe un prédicat nommant la clé de clustering à colonne unique et un argument à une valeur scalaire sur la clé de clustering, l'opérateur de recherche d'index clusterisé sera toujours utilisé, même s'il existe déjà un index de couverture sur une deuxième colonne dans le table sans index.

1
Bob Letts