Bonjour,

Soit une requête du genre
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'
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 : 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
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
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 !

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 !