Un SELECT avec plusieurs prédicats indexés liés par AND sera exécuté comme une intersection du résultat de plusieurs SELECT bénéficiant chacun d'un index, si les prédicats sont des égalités.
Exemple :
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.SELECT * FROM emp WHERE nom = 'MARTIN' AND n_dept = 20;
Exemple :
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).SELECT * FROM emp WHERE nom = 'MARTIN' OR n_dept = 20 ;
Exemple :
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.SELECT * FROM emp WHERE nom = 'MARTIN' AND n_dept + 0 = 20;
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' ;
Yolaine.Bourda@supelec.fr