Optimisation d'une requête SQL
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:
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.