Variations de performance de l'opérateur IN
Bonjour, j'ai un problème de performance d'une requete avec opérateur IN
il semble qu'il y ai une différence entre un IN (expression_list) et un IN (subquery)
Je m'explique, la requete suivante est très lente (500ms) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
select cdhop,
nuagt
from gh.gagt agt
WHERE
cdhop='01' and
nuagt IN (
select nuagt from gh.gagt agt where cdhop='01' and
flmed='O' and nvl(agt.dtes1,to_date('31/12/2037','dd/mm/yyyy')) > to_date('12/07/2006','dd/mm/yyyy') and
agt.CDSME = (select gcom.CDCLECOM from gh.gcom gcom, pgpmg.discipline_dam disc WHERE disc.cd_discipline='421' and
gcom.oid_gcom=disc.OID_GCOM_GSME)
) and
pgpmg.infos_gagt.GET_DTEE ( nuagt,'01', to_date('12/07/2006','dd/mm/yyyy')) is not NULL |
par contre, si je remplace ma sous requete par son resultat, c'est beaucoup plus rapide (30ms)
Code:
1 2 3 4 5 6 7 8 9
|
select cdhop,
nuagt
from gh.gagt agt
WHERE
cdhop='01' and
nuagt IN ( '020320','020851','041587'
) and
pgpmg.infos_gagt.GET_DTEE ( nuagt,'01', to_date('12/07/2006','dd/mm/yyyy')) is not NULL |
cette liste ( '020320','020851','041587') est le résultat direct de ma sous-requete qui met 63ms à s'executer toute seule
Vous avez une explication à ça, et (mieux encore) éventuellement une proposition pour me faire gagner des millisecondes ??