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 : 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>....)
La table1 contient environ 4 millions de lignes, et la table2 en a 140 mille.

Le plan d'exécution est le suivant:
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
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 : 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)
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