Question

Je viens d'entendre le terme index couvert dans une discussion de base de données - qu'est-ce que cela signifie?

Était-ce utile?

La solution

Un index couvrant est un index qui contient toutes les colonnes dont vous avez besoin pour votre requête, voire davantage.

Par exemple, ceci:

SELECT *
FROM tablename
WHERE criteria

utilisera généralement des index pour accélérer la résolution des lignes à récupérer à l'aide de critères , mais il ira ensuite à la table complète pour récupérer les lignes.

Cependant, si l'index contenait les colonnes column1, column2 et column3 , alors ce sql:

SELECT column1, column2
FROM tablename
WHERE criteria

et, à condition que cet index puisse être utilisé pour accélérer la résolution des lignes à extraire, il contient déjà les valeurs des colonnes qui vous intéressent, il n'a donc pas besoin d'aller à la table pour récupérer les lignes, mais peut produire les résultats directement à partir de l'index.

Cela peut également être utilisé si une requête typique utilise une ou deux colonnes pour résoudre les lignes, puis ajoute généralement une ou deux colonnes. Il peut donc s'avérer utile d'ajouter ces colonnes supplémentaires (si identique partout) à l'index, de sorte que le processeur de requête puisse tout extraire de l'index lui-même.

Voici un article: La couverture d'index améliore les performances de la requête SQL Server sur le sujet.

Autres conseils

L’indice de couverture n’est qu’un indice ordinaire. Cela s'appelle " couvrir " s'il peut satisfaire une requête sans qu'il soit nécessaire d'analyser des données.

exemple:

CREATE TABLE MyTable
(
  ID INT IDENTITY PRIMARY KEY, 
  Foo INT
) 

CREATE NONCLUSTERED INDEX index1 ON MyTable(ID, Foo)

SELECT ID, Foo FROM MyTable -- All requested data are covered by index

C’est l’une des méthodes les plus rapides pour récupérer des données d’un serveur SQL.

Les index de couverture sont des index qui "couvrent". toutes les colonnes nécessaires d'une table spécifique, éliminant ainsi le besoin d'accéder à la table physique pour une requête / opération donnée.

Étant donné que l'index contient les colonnes souhaitées (ou un sur-ensemble de celles-ci), l'accès aux tables peut être remplacé par une recherche ou une analyse d'index, ce qui est généralement beaucoup plus rapide.

Colonnes à couvrir:

  • conditions paramétrées ou statiques; colonnes restreintes par une condition paramétrée ou constante.
  • joindre des colonnes; colonnes utilisées dynamiquement pour rejoindre
  • colonnes sélectionnées; pour répondre aux valeurs sélectionnées.

Bien que les index de couverture puissent souvent offrir de bons avantages pour la récupération, ils ajoutent quelque peu pour insérer / mettre à jour le temps système; en raison de la nécessité d'écrire des lignes d'index supplémentaires ou plus grandes à chaque mise à jour.

Index de couverture pour les requêtes jointes

Les index de couverture sont probablement plus précieux en tant que technique de performance pour les requêtes jointes. En effet, les requêtes jointes sont plus coûteuses & amp; plus susceptibles que les extractions sur une seule table de subir des problèmes de performances de coût élevé.

  • dans une requête jointe, les index de couverture doivent être considérés par table.
  • chaque 'indice de recouvrement' supprime un accès à une table physique du plan & amp; le remplace par un accès d'index uniquement.
  • étudier les coûts du plan & amp; expérience avec laquelle les tableaux valent le plus la peine d’être remplacés par un indice de couverture.
  • De cette manière, le coût multiplicatif des plans de jointure importants peut être considérablement réduit.

Par exemple:

select oi.title, c.name, c.address
from porderitem poi
join porder po on po.id = poi.fk_order
join customer c on c.id = po.fk_customer
where po.orderdate > ? and po.status = 'SHIPPING';

create index porder_custitem on porder (orderdate, id, status, fk_customer);

Voir:

Disons que vous avez un tableau simple avec les colonnes ci-dessous, vous n’avez indexé que l’Id ici:

Id (Int), Telephone_Number (Int), Name (VARCHAR), Address (VARCHAR)

Imaginez que vous deviez exécuter la requête ci-dessous et vérifier si elle utilisait l'index et si elle fonctionnait efficacement sans appels d'E / S ou non. N'oubliez pas que vous avez uniquement créé un index sur Id .

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

Lorsque vous vérifiez les performances pour cette requête, vous serez déçu, étant donné que Telephone_Number n'est pas indexé, vous devez extraire les lignes de la table à l'aide d'appels d'E / S. Il ne s’agit donc pas d’une couverture indexée car il existe dans la requête une colonne qui n’est pas indexée, ce qui entraîne des appels E / S fréquents.

Pour en faire un index couvert, vous devez créer un index composite sur (Id, Telephone_Number) .

Pour plus de détails, consultez ce blog: https://www.percona.com / blog / 2006/11/23 / couvrant-index-et-prefix-indexes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top