Bonjour,
Soit une requête du genre
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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'
Maintenant, je voudrais appliquer un autre critère, du genre :
Or, lorsque je le fais, la requête rame terriblement. Donc j'essaye ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
après avoir pris soin de mettre une séquence dans la fonction, initialisée à zéro avant de lancer la requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 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 !
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 !
Merci pour toute explication et idée pour booster cette requête !
Partager