Temps d'exécution très long : jointure
Bonjour,
Je cherche à optiser une requête dans ma procédure parce que j'ai un temps d'exécution extrêmement long et je n'ai pas de résultat.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
....
INSERT INTO MA_TABLE_1 (VENDEUR, NOM, TITRE, REGION, SOUSREGION, NBREFTOTAL)
SELECT A.VENDEUR, NOM, TITRE, LIBREGION, LIBSOUSREGION, SUM(NBREF)
FROM MA_TABLE_2,
LIBREGION,
LIBSOUSREGION,
( SELECT MA_TABLE_TEMP.VENDEUR VENDEUR,
MA_TABLE_TEMP.TITRE TITRE,
MA_TABLE_TEMP.CIP CIP,
FONCTION_CALCUL (MA_TABLE_TEMP.COM, date_debut, date_fin, MA_TABLE_TEMP.REFERENCE) NBREF
FROM MA_TABLE_TEMP
) A
WHERE A.VENDEUR = MA_TABLE_2.VENDEUR
AND MA_TABLE_2.REGION = LIBREGION.REGION
AND MA_TABLE_2.SOUS_REGION = LIBSOUSREGION.SOUSREGION
GROUP BY A.VENDEUR, NOM, TITRE, LIBREGION, LIBSOUSREGION ;
.... |
Le problème se pose à ce niveau parce que sans cette requête j'ai quand même un résultat d'éxécution en si peu de temps.
Situation :
Oracle 10
Pas d'index sur MA_TABLE_1, pas de clé
MA_TABLE_2 : clé primaire (VENDEUR), création d'index sur les colonnes REGION, SOUSREGION
LIBREGION : clé primaire (REGION)
LIBSOUSREGION : clé primaire (SOUSREGION)
MA_TABLE_TEMP : pas de clé, pas d'index
MA_TABLE_1,MA_TABLE_2,MA_TABLE_TEMP environ neuf cent mille (900 000) lignes chacune.
Ma fonction FONCTION_CALCUL renvoie un number
Select count(distinct champ) from ( select distinct p from A union select ....) T where ...;
select FONCTION_CALCUL(...) from dual; aucun problème
Solution 1:
Je l'ai éclatée en 3 requêtes avec une nouvelle table temporaire
1)Insertion dans MA_TABLE_1 sans le champ calcul : VENDEUR, NOM, TITRE, REGION, SOUSREGION
2)Insertion dans une table temporaire avec le champ : VENDEUR, résultat de la fonction FONCTION_CALCUL
3)Insertion dans MA_TABLE_1 en faisant le sum sur la colonne résultat
Je n'ai pas eu de résultat
Solution 2 :
1)Insertion dans MA_TABLE_1 sans le champ calcul : VENDEUR, NOM, TITRE, REGION, SOUSREGION
2)Curseur pour le calcul
...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| for enreg in (select vendeur,titre from MA_TABLE_1) loop
for rec in (select vendeur, com, reference
from MA_TABLE_TEMP
where vendeur = enreg.vendeur
and titre = enreg.titre ) loop
nbref := nbref + F_CALCUL_NB_REF_MERE_PERIODE (rec.COM, date_debut, date_fin, rec.REFERENCE);
end loop;
UPDATE MA_TABLE_1
SET NB_REF = nbref
WHERE MA_TABLE_1.VENDEUR = enreg.VENDEUR
and MA_TABLE_1.titre = enreg.titre;
nbref := 0;
end loop; |
...
Idem pas de résultat
Dans MA_TABLE_TEMP beaucoup de colonnes identiques ou vides, pas judicieux d'avoir un index.
Problème, comment optimiser cette requête pour le temps d'exécution et espérer avoir un résultat quand je lancerai la procédure.
Merci