Il existe en fait une table répertoriant les triplets de l'application :
De plus, il existe un index sur cette table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 create table RF_CPPDVREF ( ID integer not null, CIRCUITDEPREPARATION_CODE VARCHAR(30), POINTDEVENTE_CODE VARCHAR(5), REFERENTIEL integer, primary key (ID));
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CREATE UNIQUE INDEX RF_IDX_CPPDVREF ON RF_CPPDVREF (REFERENTIEL, CIRCUITDEPREPARATION_CODE, POINTDEVENTE_CODE) TABLESPACE IND;
De plus, j'ai essayé de refaire la requete pour prendre en compte les triplets qui ne sont pas présents dans la table RF_VOLUMEPREPREAL.
Bon, il me reste à mettre une valeur par défaut pour les dates quand le triplet n'est pas présent dans la table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 SELECT JOUR.DATE_CALENDRIER, REFER.CODE_ETABLISSEMENT, REFER.ID AS ID_REF, CPPDV.CIRCUITDEPREPARATION_CODE, CPPDV.POINTDEVENTE_CODE, 0, 'UPDT' FROM RF_REFERENTIEL REFER INNER JOIN RF_JOUR JOUR ON 1=1 INNER JOIN RF_CPPDVREF CPPDV ON CPPDV.REFERENTIEL = REFER.ID LEFT OUTER JOIN RF_VOLUMEPREPREAL VOL ON VOL.REFERENTIEL = REFER.ID AND VOL.CIRCUITPREPARATION = CPPDV.CIRCUITDEPREPARATION_CODE AND VOL.POINTDEVENTE = CPPDV.POINTDEVENTE_CODE AND VOL.JOUR = JOUR.date_calendrier WHERE REFER.CODE='REF_REALISE' AND jour.date_calendrier BETWEEN (SELECT MIN(VOL2.JOUR) FROM RF_VOLUMEPREPREAL VOL2 WHERE VOL2.circuitpreparation = CPPDV.CIRCUITDEPREPARATION_CODE AND VOL2.pointdevente = CPPDV.POINTDEVENTE_CODE AND VOL2.referentiel = REFER.ID) AND (SELECT MAX(VOL3.JOUR) FROM RF_VOLUMEPREPREAL VOL3 WHERE VOL3.circuitpreparation = CPPDV.CIRCUITDEPREPARATION_CODE AND VOL3.pointdevente = CPPDV.POINTDEVENTE_CODE AND VOL3.referentiel = REFER.ID) AND VOL.JOUR IS NULL;
Ça améliore grandement les performances initiales, par contre c'est beaucoup plus long que la requête de waldar ... (180 secondes au lieu de 10).
Peut être que le PARTITION BY y est pour quelque chose, mais je n'arrive pas à saisir le principe de cette instruction par rapport à ce que j'ai lu à droite et à gauche.
Si vous voyez des choses choquantes, ne vous gênez pas !
Partager