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) :
par contre, si je remplace ma sous requete par son resultat, c'est beaucoup plus rapide (30ms)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
cette liste ( '020320','020851','041587') est le résultat direct de ma sous-requete qui met 63ms à s'executer toute seule
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Vous avez une explication à ça, et (mieux encore) éventuellement une proposition pour me faire gagner des millisecondes ??
Partager