web-dev-qa-db-fra.com

Qu'est-ce qu'un indice couvert?

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

65
Martynnw

Un index couvrant est un index qui contient toutes, et peut-être plus, les colonnes dont vous avez besoin pour votre requête.

Par exemple, ceci:

SELECT *
FROM tablename
WHERE criteria

utilise généralement des index pour accélérer la résolution des lignes à récupérer à l'aide des critères , mais il ira ensuite dans le tableau complet pour récupérer les lignes.

Cependant, si l'index contenait les colonnes colonne1, colonne2 et colonne3 , alors ce sql:

SELECT column1, column2
FROM tablename
WHERE criteria

et, à condition qu'un index particulier puisse être utilisé pour accélérer la résolution des lignes à récupérer, l'index contient déjà les valeurs des colonnes qui vous intéressent, donc il n'aura pas à aller dans 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 vous voyez qu'une requête typique utilise 1-2 colonnes pour résoudre les lignes, puis ajoute généralement 1-2 autres colonnes, il peut être avantageux d'ajouter ces colonnes supplémentaires (si elles sont identiques partout) ) à l'index, afin que le processeur de requêtes puisse tout récupérer de l'index lui-même.

Voici un article: Index Covering Boosts SQL Server Query Performance sur le sujet.

54

L'indice de couverture n'est qu'un indice ordinaire. Il est appelé "couvrant" s'il peut satisfaire une requête sans avoir besoin d'analyser les 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

Il s'agit de l'une des méthodes les plus rapides pour récupérer des données à partir du serveur SQL.

13
aku

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 devez exécuter la requête ci-dessous et vérifier si elle utilise l'index et si elle fonctionne efficacement sans appels d'E/S ou non. N'oubliez pas que vous n'avez créé un index que sur Id.

SELECT Id FROM mytable WHERE Telephone_Number = '55442233';

Lorsque vous vérifiez les performances de cette requête, vous serez déçu, car Telephone_Number n'est pas indexé, il doit récupérer les lignes de la table à l'aide d'appels d'E/S. Donc, ce n'est pas une couverture indexée car il y a une colonne dans la requête qui n'est pas indexée, ce qui conduit à des appels d'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, veuillez vous référer à ce blog: https://www.percona.com/blog/2006/11/23/covering-index-and-prefix-indexes/

2
JumpMan

Les index de couverture sont des index qui "couvrent" toutes les colonnes nécessaires d'une table spécifique, supprimant la nécessité 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 d'entre elles), l'accès à la table 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 la jonction
  • colonnes sélectionnées; pour répondre aux valeurs sélectionnées.

Bien que la couverture des index puisse souvent fournir de bons avantages pour la récupération, ils ajoutent quelque peu pour insérer/mettre à jour la surcharge; en raison de la nécessité d'écrire des lignes d'index supplémentaires ou plus grandes à chaque mise à jour.

Couverture des index pour les requêtes jointes

Les index de couverture sont probablement les plus utiles en tant que technique de performance pour les requêtes jointes. En effet, les requêtes jointes sont plus coûteuses et plus susceptibles que les extractions à table unique de rencontrer des problèmes de performances à coût élevé.

  • dans une requête jointe, les index couvrant doivent être considérés par table.
  • chaque "index de couverture" supprime un accès à la table physique du plan et le remplace par un accès à l'index uniquement.
  • étudier les coûts du plan et expérimenter les tables qui valent le plus la peine d'être remplacées par un indice de couverture.
  • par ce moyen, le coût multiplicatif des grands plans de jointure 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:

2
Thomas W