Incompréhension d'un plan d'éxécution
Bonjour, mon titre n'est pas très explicite j'avoue.
J'ai en fait un problème de compréhension quant à l'utilisation ou non d'un index par oracle.
Voici ma requête:
Code:
1 2 3 4
| select *
from ANNONCE this_
inner join LIGNE_COMMANDE lc1_ on this_.NUM_ANN=lc1_.NUM_ANN
where lower(lc1_.NOM) like '%cora%' order by this_.NUM_ANN desc |
Ici oracle fait un full scan, à cause du lower() et du like '%cora%'.
Avec cette requête:
Code:
1 2 3 4
| select *
from ANNONCE this_
inner join LIGNE_COMMANDE lc1_ on this_.NUM_ANN=lc1_.NUM_ANN
where lc1_.NOM like 'cora%' order by this_.NUM_ANN desc |
Oracle utilise les index, là aussi je comprends pourquoi.
Maintenant cette requête:
Code:
1 2 3 4 5 6 7 8
| select * from
(
select *
from ANNONCE this_
inner join LIGNE_COMMANDE lc1_ on this_.NUM_ANN=lc1_.NUM_ANN
where lower(lc1_.NOM) like '%cora%' order by this_.NUM_ANN desc
)
where rownum <= 20 |
Oracle utilise les index..et j'avoue ne pas savoir pourquoi, logiquement à cause du lower() et du '%cora%' il devrait toujours utiliser un full scan.
Ça risque de vous paraître trivial dans ce cas merci d'éclairer ma lanterne :)