Optimisation d'un Group by
Bonjour.:)
J'ai une requête trop longue à exécuter et je ne sais pas comment l'améliorer, notamment s'il y a des index précis à utiliser dans le cadre d'un group
by.
La requête est du type:
Code:
1 2 3 4 5
| select a.col1, a.col2, a.col3, decode (b.col1,..<valeurs en dur>....) as bcol,
sum(a.col4), sum(a.col5)
from table1 a, table2 b
where a.col6 between b.valmin and b.valmax
group by a.col1, a.col2, a.col3, decode (b.col1,..<valeurs en dur>....) |
La table1 contient environ 4 millions de lignes, et la table2 en a 140 mille.
Le plan d'exécution est le suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| SELECT STATEMENT 410339
HASH GROUP BY 410339
MERGE JOIN 258493
SORT JOIN 881
REMOTE TABLE2 168
FILTER
Prédicats de filtre
B.VALMAX>=TO_NUMBER(A.col6)
SORT JOIN 35772
Prédicats d accès
B.VALMIN<=TO_NUMBER(A.col6)
Prédicats de filtre
B.VALMIN<=TO_NUMBER(A.col6)
TABLE ACCESS TABLE1 FULL 5636 |
La table1 a un index sur col6, la table2 a un index commun sur valmin, valmax.
Avant de commencer la réflexion, je vous donne une précision. J'utilise une astuce dans une autre requête (sur la même table), qui permet d'optimiser énormément le temps de traitement.
En l'occurrence, la requête suivante est très rapide:
Code:
1 2 3 4 5 6 7
| select /*+ ordered use_nl(b) */ a.col1, a.col2, a.col3, decode (b.col1,..<valeurs en dur>....) as bcol,
sum(a.col4), sum(a.col5)
from table1 a, table2 b
where a.col6 between b.valmin and b.valmax
and b.valmax =
(select min(b2.valmax) from table 2 b2
where b2.valmax >= a.col6) |
Si j'enlève le Hint et la sous-requête en gras, ça n'en finit pas.
Je les ai ajoutés dans la requête avec le group by, mais je n'ai pas l'optimisation souhaitée...
Merci de m'aider à avancer:ccool: