Exemple d'optimisation par indexation
Soit la table "tlivres" contenant 19205 lignes :
Requête sur la clé primaire
Enregistrement retourné
Plan d'exécution
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=167 )
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TLIVRES' (Cost=2 Card=1 Bytes=167)
2 1 INDEX (UNIQUE SCAN) OF 'SYS_C0044628' (UNIQUE) (Cost=1 Card=1)
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=167 ) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TLIVRES' (Cost=2 Card=1 Bytes=167) 2 1 INDEX (UNIQUE SCAN) OF 'SYS_C0044628' (UNIQUE) (Cost=1 Card=1)
Le coût est faible et la cardinalité (nombre de lignes remontées) est de 1, car la clé primaire est toujours associée à un index unique (créé automatiquement par le système si cela n'a pas été fait explicitement par l'utilisateur).
Requête sur le champ ISBN
Plan d'exécution sans index
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=25 Card=1 Bytes= 33233)
1 0 TABLE ACCESS (FULL) OF 'TLIVRES' (Cost=25 Card=1 Bytes=33233)
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=25 Card=1 Bytes= 33233) 1 0 TABLE ACCESS (FULL) OF 'TLIVRES' (Cost=25 Card=1 Bytes=33233)
L'ensemble de la table est parcouru et le coût est de 25. Si les statistiques sont à jour (clause ANALYSE) le système prévoira de ne remontrer qu'un enregistrement (Card=1
).
Ajout d'un index B-Tree
Plan d'exécution avec index
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=33233)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TLIVRES' (Cost=2 Card=1 Bytes=33233)
2 1 INDEX (RANGE SCAN) OF 'IDX_ISBN' (NON-UNIQUE) (Cost=1 Card=1)
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=33233) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TLIVRES' (Cost=2 Card=1 Bytes=33233) 2 1 INDEX (RANGE SCAN) OF 'IDX_ISBN' (NON-UNIQUE) (Cost=1 Card=1)
L'accès se fait à présent via l'index et le coût n'est plus que de 2.
Requête sur le champ ANNEE
Enregistrement retourné
Plan d'exécution sans index
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=25 Card=1 Bytes=13 )
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'TLIVRES' (Cost=25 Card=798 Bytes=2587)
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=25 Card=1 Bytes=13 ) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TLIVRES' (Cost=25 Card=798 Bytes=2587)
Le coût prévu est de 25 (c'est à dire le même que pour la requête précédente, puisque toute la table devra être parcourue de la même façon). On notera que le nombre estimé de lignes à compter est de 798, pour 595 en réalité.
Ajout d'un index Bitmap
Le champ ANNEE compte 25 valeurs différentes, on choisit de l’indexer par un index bitmap étant donné son relativement faible pouvoir discriminant.
Plan d'exécution sans index
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=1 Card=1 Bytes=13)
1 0 SORT (AGGREGATE)
2 1 BITMAP CONVERSION (COUNT)
3 2 BITMAP INDEX (SINGLE VALUE) OF 'IDX_ANNEE'
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=1 Card=1 Bytes=13) 1 0 SORT (AGGREGATE) 2 1 BITMAP CONVERSION (COUNT) 3 2 BITMAP INDEX (SINGLE VALUE) OF 'IDX_ANNEE'
L'accès se fait à présent via l'index bitmap et le coût n'est plus que de 1.