Bonjour,
je cherche à améliorer les temps de réponse d'une requête très coûteuse. En anlaysant cette requête, je m'apperçois que la fonction MAX induit un Full Scan d'une table très volumineuse (5 millions d'enregitrement sur une vingtaine de colonne). Tous les index sont OK. Voici mon soucis :
si je lance la requête suivante, un full scan sur la table act_entry est effectué :
SELECT * FROM(
SELECT objid ,MAX(entry_time) AS entry_time
FROM TABLE_ACT_ENTRY
GROUP BY objid)
WHERE entry_time >= '02/03/2006'
AND entry_time <= '03/03/2006'
moi, je voudrais que l'optimiseur l'interprète comme ceci (l'optimiseur fait un range scan sur l'index ind_entry_time) :
SELECT * FROM(
SELECT objid ,MAX(entry_time) AS entry_time
FROM TABLE_ACT_ENTRY
WHERE entry_time >= '02/03/2006'
AND entry_time <= '03/03/2006'
GROUP BY objid)
NB : entry_time est une date et objid un identifiant number
ma contrainte est que mon where est forcément à l'éxtérieur de la requête (la requête intérieure avec le group by est en fait une vue).
Je ne suis pas expert sql et je bloque complétement sur ce phénomène.
Quelqu'un aurait-il une idée pour forcer la requête avec un hint ?
La solution que j'ai trouvé est :
SELECT * FROM(
SELECT objid ,MAX(entry_time) AS entry_time, entry_time as entry_time2
FROM TABLE_ACT_ENTRY
GROUP BY objid,entry_time2)
WHERE entry_time2 >= '02/03/2006'
AND entry_time2 <= '03/03/2006'
mais c'est vraiment pas clean...
Merci d'avance
Partager