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 :

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)
   ) ;
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_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 :

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;
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
 
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 ...