optimisation requête Oracle 10
Bonjour,
Soit une requête du genre
Code:
1 2 3 4 5
| select *
from Table1, Table2
where Table1.Cle = Table2.Cle(+)
and NVL(Table2.Date, Table1.Date) >= '01/01/2007'
and NVL(Table2.Date, Table1.Date) < '01/02/2007' |
Table1 contient 150 000 enregistrements, Table2 est vide. La restriction sur la période fait que cette requête ne retourne que 1600 enregistrements, en 1 seconde, tout va bien. :)
Maintenant, je voudrais appliquer un autre critère, du genre :
Code:
1 2 3 4 5 6
| select *
from Table1, Table2
where Table1.Cle = Table2.Cle(+)
and NVL(Table2.Date, Table1.Date) >= '01/01/2007'
and NVL(Table2.Date, Table1.Date) < '01/02/2007'
and Fonction(Table1.Champ) = 0 |
Or, lorsque je le fais, la requête rame terriblement. :? Donc j'essaye ceci :
Code:
1 2 3 4 5 6 7 8 9
| select *
from (
select *
from Table1, Table2
where Table1.Cle = Table2.Cle(+)
and NVL(Table2.Date, Table1.Date) >= '01/01/2007'
and NVL(Table2.Date, Table1.Date) < '01/02/2007'
)
where Fonction(Table1.Champ) = 0; |
après avoir pris soin de mettre une séquence dans la fonction, initialisée à zéro avant de lancer la requête.
Après exécution, la séquence vaut 90 000 et quelques, ce qui explique la lenteur, mais je ne comprends pas pourquoi on passe 90 000 fois dans cette fonction ! :pleure:
La question reste : comment faire pour qu'il n'exécute cette fonction que pour les 1600 enregistrements déjà sélectionnés pour la requête ?
Je précise que si je supprime la jointure avec la table vide, le résultat de la requête reste le même (normal), mais la séquence vaut bien 1600 et la requête va vite ! :marteau:
Merci pour toute explication et idée pour booster cette requête ! ;)