Bonjour à tous.
Encore un problème d'optimisation (cf. autre problème)...
Je dois optimiser une vue qui met trop de temps à retourner les informations qu'elle contient.
Celle-ci met en jeu trois tables.
La table RF_INFO_CP_PDV_VIEW :
La table RF_VOLUMEPREPREAL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE TABLE RF_INFO_CP_PDV_VIEW ( "CODE_ETABLISSEMENT" VARCHAR2(3 BYTE), "ID_REF_REAL" NUMBER(*,0) NOT NULL ENABLE, "ID_REF_CONS" NUMBER(*,0) NOT NULL ENABLE, "CODE_CP" VARCHAR2(30 BYTE) NOT NULL ENABLE, "CODE_CPGTA" VARCHAR2(3 BYTE), "LIBELLE_CP" VARCHAR2(30 BYTE), "CODE_PDV" VARCHAR2(5 BYTE) NOT NULL ENABLE, "LIBELLE_PDV" VARCHAR2(35 BYTE) ) ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 create table RF_VOLUMEPREPREAL ( REFERENTIEL integer not null, POINTDEVENTE VARCHAR(5) not null, CIRCUITPREPARATION VARCHAR(30) not null, J OUR DATE not null, UO double precision, CODE_ETABLISSEMENT VARCHAR(3), PROG_WRITER VARCHAR(5), primary key (REFERENTIEL, POINTDEVENTE, CIRCUITPREPARATION, JOUR)); );
La table RF_VOLUMEPREPCONSTEMP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 create table RF_VOLUMEPREPCONSTEMP ( JOUR DATE not null, REFERENTIEL integer not null, POINTDEVENTE VARCHAR(5) not null, CIRCUITPREPARATION VARCHAR(30) not null, UO double precision, CODE_ETABLISSEMENT VARCHAR(3), primary key (JOUR, REFERENTIEL, POINTDEVENTE, CIRCUITPREPARATION));
En gros dans la première table, le champ ID_REF_REAL correspond au champ REFERENTIEL de la deuxième, et le champ ID_REF_REAL correspond au champ REFERENTIEL de la troisième.
Voici ce que doit faire ma vue :
Pour chaque ligne de la première table, je veux l'ensemble des uo de la deuxième, et, s'ils existent l'ensemble des uo de la troisième.
Voici le code de ma vue :
Pour information, la requete qui est faite dessus est :
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 CREATE OR REPLACE FORCE VIEW RF_VWVOLUMEPREPBYJOUR AS SELECT INFO.CODE_ETABLISSEMENT, INFO.CODE_CP, INFO.CODE_CPGTA, INFO.LIBELLE_CP, INFO.CODE_PDV, INFO.LIBELLE_PDV, VPR.JOUR AS JOUR, VPR.UO AS UO_REALISE, VPCT.UO AS UO_CONSOLIDE FROM RF_INFO_CP_PDV_VIEW INFO INNER JOIN RF_VOLUMEPREPREAL VPR ON VPR.REFERENTIEL = INFO.ID_REF_REAL AND VPR.CIRCUITPREPARATION = INFO.CODE_CP AND VPR.POINTDEVENTE = INFO.CODE_PDV AND VPR.CODE_ETABLISSEMENT = INFO.CODE_ETABLISSEMENT LEFT OUTER JOIN RF_VOLUMEPREPCONSTEMP VPCT ON VPCT.REFERENTIEL = INFO.ID_REF_CONS AND VPCT.CIRCUITPREPARATION = INFO.CODE_CP AND VPCT.POINTDEVENTE = INFO.CODE_PDV AND VPCT.CODE_ETABLISSEMENT = INFO.CODE_ETABLISSEMENT AND VPCT.JOUR = VPR.JOUR;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT * FROM VWVOLUMEPREPBYJOUR WHERE CODE_ETABLISSEMENT = 'A' AND CODE_PDV = 'B' AND CODE_CP = 'C' AND JOUR BETWEEN 'DATE1' AND 'DATE2'
Cette requête met approximativement 3 minutes à s'exécuter alors que les tables 2 et 3 ne contiennent que 5% des enregistrements ...
Partager