Ils ont pour objectif d'accélérer l'extraction des données et sont basés sur le principe de la relation valeur => ROWID (n° unique identifiant une ligne) des lignes d'une table. Ils sont montés en mémoire vive lors de l'exécution des requêtes donc d'un accès rapide.

On crée un index sur une colonne d'une table quand elle est très présente dans les requêtes. Un index peut servir à mettre en œuvre la clause ORDER BY car il est lui-même trié, mais ce n'est pas sa vocation première.

Types d'index

  • B-Tree : base sur la technologie des arbres binaires, particulièrement adapté aux gros volumes, ne prend pas en compte les valeur NULL.
  • Bitmap : index binaires de type séquentiel (000=> NULL, 001 => première valeur, 010 => deuxième valeur …). Particulièrement adapté pour les "petites" tables (moins de quelques centaines de lignes) mais sensibles aux verrous lors des ordres LMD (INSERT, UPDATE, DELETE).

Création

CREATE [UNIQ] INDEX nom_index ON nom_table (colonne(s) [ASC|DESC]);

CREATE INDEX idx_rs_client ON client(rs_client);
Ici l'index sera de type B-Tree et les homonymes seront possibles, il est ascendant par défaut.

CREATE UNIQ INDEX idx_email_client ON client(email_client);
Ici l'index a une double utilité, accélérer les extractions et garantir qu'il n'y aura pas deux emails identiques.

CREATE BITMAP INDEX ON categorie(lib_categorie);
Ici l'index sera de type BITMAP car il y a 22 catégories et qu'elles sont rarement modifiées.

Suppression

DROP INDEX nom_index;
DROP INDEX idx_rs_client;

Important : 

  • En dessous de quelques centaines de lignes, le système passera plus de temps à gérer un index de type B-Tree qu'à l'utiliser.
  • On ne crée pas d'index sur les clés primaires car ils sont créés par défaut.