Index
Tdm
Précédent Choix
des chemins d'accès
Go up to L'optimiseur
de requêtes
Suivant Jointures
sans index
L'optimiseur d'interrogation classe les différents types de prédicats en fonction
de leur syntaxe dans l'ordre suivant ; du plus sélectif au moins sélectif :
oracle peut dans certains cas utiliser plusieurs index sur une même table (5 au max), y compris pour évaluer des prédicats lies par OR.
Un SELECT bénéficiant chacun d'un index, si les prédicats sont des égalités.
Exemple :
SELECT * FROM emp WHERE nom = 'MARTIN' AND n_dept = 20;
De même un SELECT avec plusieurs prédicats liés par OR sera exécuté comme une union du résultat de plusieurs SELECT bénéficiant chacun d'un index. Dans ce cas, il faut que tous les prédicats bénéficient d'un index.
Exemple :
SELECT * FROM emp WHERE nom = 'MARTIN' OR n_dept = 20 ;
Dans ces cas il se peut que l'utilisation de l'un des index soit pénalisante. Ce peut être le cas d'un index peu sélectif, alors que les autres index utilisables sont très sélectifs. Dans ce cas l'on peut empêcher oracle d'utiliser les index inadéquats, en formulant les conditions de telle façon que le critère de recherche soit une fonction de la colonne indexée et non pas la colonne indexée elle même (dans ce cas oracle n'utilise pas l'index).
Exemple :
SELECT * FROM emp WHERE nom = 'MARTIN' AND n_dept + 0 = 20;
où les champs nom et n_dept sont indexés. Le fait d'ajouter 0 à la colonne n_dept empêche d'utiliser l'index sur n_dept, qui ne ferait que ralentir la requête car il est peu sélectif. L'index sur nom, qui est très sélectif, suffit.
De la même façon, l'on peut concaténer une chaîne vide à une colonne de type caractère pour empêcher oracle d'utiliser l'index sur cette colonne :
SELECT * FROM emp WHERE nom = 'MARTIN' AND fonction ||''= 'directeur' ;
Index
Tdm
Précédent Choix des chemins d'accès
Go up to L'optimiseur de requêtes
Suivant Jointures sans index