Soit la table "tlivres" contenant 19205 lignes :
CREATE TABLE tlivres (
code number primary key,
isbn varchar2(20),
titre varchar2(255),
annee number(4));
SELECT * FROM tlivres WHERE code=1000;
CODE ISBN TITRE ANNEE
------ ------------- -------------------- -----
1000 3-8055-3601-1 Biocompatibility 1994
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).
SELECT * FROM tlivres WHERE isbn='3-8055-3601-1';
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
).
CREATE INDEX idx_isbn ON tlivres(isbn);
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.
SELECT count(*) FROM tlivres WHERE annee=1994;
COUNT(*)
----------
595
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é.
Le champ ANNEE compte 25 valeurs différentes, on choisit de l’indexer par un index bitmap étant donné son relativement faible pouvoir discriminant.
CREATE BITMAP INDEX idx_annee ON tlivres(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.