Bonjour,

j'ai une requête qui met un petit plus d'une heure pour s'exécuter, et je souhaiterais l'optimiser.
Pouvez-vous me dire si vous voyez des pistes d'amélioration ?

Voici ma requête :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
    select /*+ parallel(mesure,5) */
    ma_table2.*,
    MAX (NVL (ma_table1.canal, -1)) OVER (PARTITION BY ma_table1.idr , ma_table2.date) maxcanal
  FROM (TMP tmp
  LEFT OUTER JOIN ma_table1 ON (ma_table1.idr = tmp.nom  AND ma_table1.type = 'TYP')
  LEFT OUTER JOIN ma_table2 ON (ma_table1.id = ma_table2.id 
                                            AND ma_table2.date  >= GREATEST (tmp.datedebut, ma_table1.datedebut)
                                            AND datepoint  < LEAST (tmp.datefin + 1, ma_table1.datefin + 1) );
Les volumétries de mes 3 tables sont :
- pour TMP : 5 000 enregistrements.
- pour ma_table1 : 150 000 enregistrements.
- pour ma_table2 : 4 500 000 000 enregistrements.

J'ai identifié 2 axes d'amélioration qui sont coûteux :
- les LEFT OUTER JOIN
- l'opération d'aggrégation : MAX (NVL (ma_table1.canal, -1)) OVER (PARTITION BY ma_table1.idr , ma_table2.date) maxchannel.

Mais je ne vois aucun moyen pour contourner cela.
Avez-vous des pistes à me proposer ?

En espérant avoir un peu d'aide à ce sujet...

Merci,
Berni.