Je viens d'entendre le terme index couvert dans une discussion sur la base de données - qu'est-ce que cela signifie?
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.
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.
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/
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:
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.
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é.
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: