web-dev-qa-db-fra.com

Quels sont les différents types d'indices, quels sont les avantages de chacun?

Quels sont les différents types d'indices, quels sont les avantages de chacun?

J'ai entendu parler d'index couvrant et regroupés, y a-t-il plus? Où les utiliseriez-vous?

31
Brian G
  • Unique - Garantit des valeurs uniques pour la colonne (ou l'ensemble de colonnes) inclus dans l'index
  • Couverture - Inclut toutes les colonnes utilisées dans une requête particulière (ou un ensemble de requêtes), permettant à la base de données d'utiliser uniquement l'index et de ne pas avoir à regarder les données de la table pour récupérer les résultats
  • Clustered - C'est la manière dont les données réelles sont ordonnées sur le disque, ce qui signifie que si une requête utilise l'index cluster pour rechercher les valeurs, elle n'a pas à prendre l'étape supplémentaire de recherche de la ligne de table réelle pour toutes les données non inclus dans l'index.
31
Chris Shaffer

OdeToCode a un bon article couvrant les différences de base

Comme il est dit dans l'article:

Des index appropriés sont essentiels pour de bonnes performances dans les grandes bases de données. Parfois, vous pouvez compenser une requête mal écrite avec un bon index, mais il peut être difficile de compenser une mauvaise indexation, même avec les meilleures requêtes.

C'est vrai aussi ... Si vous débutez avec, je me concentrerais sur les index clusterisés et composites, car ils seront probablement ce que vous utiliserez le plus.

7
Kevin Fairchild

Je vais ajouter quelques types d'index

BITMAP - lorsque vous avez un nombre très faible de différentes valeurs possibles, très rapide et ne prend pas beaucoup de place

PARTITIONNÉ - permet de partitionner l'index en fonction d'une propriété généralement avantageuse sur de très gros objets de base de données pour des raisons de stockage ou de performances.

Index FUNCTION/EXPRESSION - utilisés pour pré-calculer une valeur basée sur la table et la stocker dans l'index, un exemple très simple peut être un index basé sur lower () ou une fonction de sous-chaîne.

6
mmaibaum

PostgreSQL autorise les index partiels, où seules les lignes qui correspondent à un prédicat sont indexées. Par exemple, vous souhaiterez peut-être indexer la table client uniquement pour les enregistrements actifs. Cela pourrait ressembler à quelque chose comme:

create index i on customers (id, name, whatever) where is_active is true;

Si vous indexez plusieurs colonnes et que vous avez de nombreux clients inactifs, cela peut être un gros gain en termes d'espace (l'index sera stocké dans moins de pages disque) et donc de performances. Pour atteindre l'index, vous devez, au minimum, spécifier le prédicat:

select name from customers where is_active is true;
5
dland

La sagesse conventionnelle suggère que le choix de l'indice doit être basé sur la cardinalité. Ils diront:

Pour une colonne faible cardinalité comme GENDER, utilisez le bitmap. Pour un cardinalité élevée comme LAST_NAME, utilisez b-tree.

Ce n'est pas le cas avec Oracle , où le choix de l'index doit plutôt être basé sur le type d'application (OLTP vs OLAP). Le DML sur les tables avec des index bitmap peut provoquer de graves conflits de verrouillage. D'un autre côté, Oracle CBO peut facilement combiner plusieurs index bitmap ensemble, et les index bitmap peuvent être utilisés pour rechercher des valeurs nulles. En règle générale:

Pour un système [~ # ~] oltp [~ # ~] avec de fréquentes requêtes DML et de routine, utilisez btree. Pour un système [~ # ~] olap [~ # ~] avec des requêtes DML et adhoc peu fréquentes, utilisez le bitmap.

Je ne sais pas si cela s'applique à d'autres bases de données, les commentaires sont les bienvenus. Les articles suivants abordent le sujet plus en détail:

3
jimmyorr

Différents systèmes de bases de données ont des noms différents pour le même type d'index, alors faites attention à cela. Par exemple, ce que SQL Server et Sybase appellent "index clusterisé" est appelé dans Oracle une "table organisée en index".

2
skaffman

Oracle propose différentes combinaisons d'index b-tree, bitmap, partitionné et non partitionné, octet inverse, jointure bitmap et domaine.

Voici un lien vers la documentation 11gR1 sur le sujet: http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

2
David Aldridge

Je vous suggère de rechercher dans les blogs de Jason Massie ( http://statisticsio.com/ ) et Brent Ozar ( http://www.brentozar.com/ ) pour les Info. Ils ont un article sur un scénario réel qui traite des indices.

2
MarlonRibunal
  1. Unique
  2. grappe
  3. hors cluster
  4. magasin de colonnes
  5. Index avec colonne incluse
  6. index sur la colonne calculée
  7. filtré
  8. spatial
  9. xml
  10. texte intégral
1
abu

Pour afficher les types d'index et ses visites de signification: https://msdn.Microsoft.com/en-us/library/ms175049.aspx

0
Christopher Karsten

SQL Server 2008 a des index filtrés , similaires aux index partiels de PostgreSQL . Les deux permettent d'inclure dans l'index uniquement des lignes correspondant aux critères spécifiés.

La syntaxe est identique à PostgreSQL:

create index i on Customers(name) where is_alive = cast(1 as bit);
0
Constantin