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?
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.
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.
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;
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:
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".
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
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.
Pour afficher les types d'index et ses visites de signification: https://msdn.Microsoft.com/en-us/library/ms175049.aspx
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);