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 : 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
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
 
 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 ??