Optimisation de procédure
Bonjour à tous.
J'ai besoin de votre aide sur une procédure qui met un certain temps à s'exécuter.
Je pense avoir repérer l'instruction qui pose problème :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
SELECT
MAX(VOL.JOUR), MIN(VOL.JOUR) INTO LD$MAXDATE, LD$MINDATE
FROM
RF_VOLUMEPREPREAL VOL
WHERE
VOL.CODE_ETABLISSEMENT = curETB.CODE
AND VOL.CIRCUITPREPARATION = curCP.CODE
AND VOL.POINTDEVENTE = curPDV.CODE
AND VOL.JOUR > LD$MINDATE
AND VOL.REFERENTIEL = LN$IDREF; |
Puis :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
INSERT INTO RF_VOLUMEPREPREAL
(CIRCUITPREPARATION, POINTDEVENTE, REFERENTIEL, UO, CODE_ETABLISSEMENT, PROG_WRITER, JOUR)
SELECT curCP.CODE, curPDV.CODE, LN$IDREF, LN$VALEUR, curETB.CODE, LC$TAG_UPDATABLE, JOUR.DATE_CALENDRIER
FROM RF_JOUR JOUR
WHERE
JOUR.DATE_CALENDRIER NOT IN(
SELECT VOL.JOUR FROM RF_VOLUMEPREPREAL VOL
WHERE VOL.CODE_ETABLISSEMENT = curETB.CODE
AND VOL.CIRCUITPREPARATION = curCP.CODE
AND VOL.POINTDEVENTE = curPDV.CODE
AND VOL.JOUR BETWEEN LD$MINDATE AND LD$MAXDATE
AND VOL.REFERENTIEL = LN$IDREF)
AND JOUR.DATE_CALENDRIER BETWEEN LD$MINDATE AND LD$MAXDATE; |
Je vous explique un peu la philosophie de la chose :
La table RF_VOLUMEPREPREAL contient un grand nombre d'enregistrements (environ 10 millions). Elle contient des UO par jour. Or, tous les jours ne sont pas renseignés.
Ma procédure consiste donc à "boucher les trous" par des 0 entre les dates retournées par la première requête.
Je crois que le problème vient du fait que je fais un insert sur un table qui est elle même interrogée par le select...
Merci de votre aide.