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:
La table1 contient environ 4 millions de lignes, et la table2 en a 140 mille.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>....)
Le plan d'exécution est le suivant:
La table1 a un index sur col6, la table2 a un index commun sur valmin, valmax.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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:
Si j'enlève le Hint et la sous-requête en gras, ça n'en finit pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
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![]()
Partager