Que sont les index de couverture et les requêtes couvertes dans SQL Server?

Pouvez-vous expliquer les concepts et la relation entre Covering Indexes et Covered Queries dans Microsoft SQL Server?

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

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

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

Si toutes les colonnes demandées dans la list de select de la requête sont disponibles dans l'index , le moteur de search n'a plus à searchr la table, ce qui peut augmenter considérablement les performances de la requête. Puisque 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 list de sélection proviennent de la même table.

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

  • Excellente video sur les avantages et les inconvénients des index et des requêtes de couverture et des index.
  • Index dans SQL Server

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

Une requête est faite dans une requête couverte par l'arrangement judicieux des index.

Une requête couverte est souvent plus performante qu'une requête non couverte en partie parce que les index non clusterisés ont plus de lignes par page que les index clusterisés ou les index groupés, donc less de pages doivent être mises en memory pour 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 index de couverture est un index utilisé dans une requête couverte. Il n'existe pas d'indice qui, en soi, est un indice de couverture. Un index peut être un index de couverture par rapport à la requête A, tout en n'étant pas en même time un index de couverture par rapport à la requête B.

Voici un article dans 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 couverture d'index

Je peux seulement supposer qu'une requête couverte est une requête qui a un index qui couvre toutes les colonnes dans son jeu d'loggings returnné. Une mise en garde – l'index et la requête devraient être construits pour permettre au server SQL d'inférer réellement de la requête que l'index est utile.

Par exemple, une jointure d'une table sur elle-même pourrait ne pas bénéficier d'un tel index (en fonction de 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 y ait 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 

Probablement ne bénéficierait pas autant, même si toutes les colonnes sont dans l'index. Pourquoi? Parce que vous ne dites pas vraiment que vous voulez utiliser l'index sortingple de PersonID,ParentID,Name .

Au lieu de cela, vous construisez une condition basée sur deux colonnes – PersonID et ParentID (qui ParentID Name ) et ensuite vous requestz tous les loggings, avec les colonnes PersonID, Name . En fait, selon l'implémentation, l'index pourrait aider la dernière partie. Mais pour la première partie, il vaut mieux avoir d'autres index.

Un indice de couverture est un index non clusterisé. Les index clusterisés et non clusterisés utilisent des trees B pour améliorer la search de données, la différence est que dans les feuilles d'un index clusterisé, un logging entier (c'est-à-dire une ligne) est stocké physiquement là, mais ce n'est pas le cas Index non clusterisés.

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

entrez la description de l'image ici

Cependant, pour un index non clusterisé, il existe deux possibilités: soit la table possède déjà un index clusterisé, soit elle ne l'est pas:

entrez la description de l'image ici

Comme le montrent les deux diagrammes, ces index non clusterisés ne fournissent pas de bonnes performances, car ils ne peuvent pas find la valeur favorite (ie Lname) uniquement à partir de l'tree B. Au lieu de cela, ils doivent effectuer une étape de search supplémentaire (search de key ou de RID) pour find la valeur de Lname. Et, c'est là que l'index couvert arrive à l'écran. Ici, l'index Non-Clustered sur ID couvre la valeur de Lname juste à côté dans les feuilles de l'tree B et il n'y a plus besoin de chercher.

entrez la description de l'image ici

Une requête couvrant est sur où tous les prédicats peuvent être appariés en utilisant les indices sur les tables sous-jacentes.

C'est la première étape vers l'amélioration des performances du sql considéré.

un index de couverture est celui qui donne toutes les colonnes requirejses et dans lequel le server SQL n'a pas à revenir à l'index cluster pour find une colonne. Ceci est réalisé en utilisant l'index non-cluster et en utilisant l'option INCLUDE pour couvrir les colonnes. Les colonnes non-keys peuvent être incluses uniquement dans les index non-cluster. Les colonnes ne peuvent pas être définies à la fois dans la colonne key et dans la list INCLUDE. Les noms de colonnes ne peuvent pas être répétés dans la list INCLUDE. Les colonnes non keys peuvent être supprimées d'une table uniquement après la première suppression de l'index non-key. S'il vous plaît voir les détails ici

Quand je me suis simplement callbacké qu'un Index Clustered se composait d'une list non-ordonnée de toutes les colonnes du tableau défini, les lumières s'allumaient pour moi. Le mot "cluster", alors, se réfère au fait qu'il y a 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 un index cluster dans la représentation de la colonne demandée, car il ne trouve pas la colonne demandée dans un autre "couvrant" l'index. Le manquant provoquera un opérateur Clustered Index Seek dans le plan d'exécution proposé, où la valeur recherchée est dans une colonne à l'intérieur de la list ordonnée représentée par l'index clusterisé.

Ainsi, une solution consiste à créer un index non clusterisé dont la colonne contient la valeur demandée dans l'index. De cette façon, il n'est pas nécessaire de referencer l'index clusterisé, et l'optimiseur devrait être en mesure d'accrocher cet index dans le plan d'exécution sans aucun indice. Si, cependant, il existe un prédicat nommant la key de clustering de colonne unique et un argument à une valeur scalaire sur la key de clustering, l'opérateur de search d'index cluster sera toujours utilisé, même s'il existe déjà un index de couverture sur une deuxième colonne table sans index.