Bonjour,
j'essaie d'optimiser la requete suivante sur une base en Oracle 8.1.7.4 :

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
create or replace view v_ticket_volucompteur as
Select
       lig.LIG_SOC_CLE                                            ,
       lig.LIG_CLE                                                ,
       pos.POST_CLE                                               ,
       pos.POST_MOY_CLE                                           ,
       pos.POST_SEQUENCAGE                                        ,
       tou.TOUR_SEQUENCAGE                                        ,
       lig.LIG_SEQUENCAGE                                         ,
       Decode(
              com.COMM_ANT_CLE,
              Null,
              agc.AGC_LIBELLE_LONG,
              ant.ANT_LIBELLE_LONG
             )                                    LIBELLE_LONG_FACT    ,
      Decode(
              com.COMM_ANT_CLE,
              Null,
              agc.AGC_LIBELLE_COURT,
              ant.ANT_LIBELLE_COURT
             )                                    LIBELLE_COURT_FACT    ,
      Decode(
              com.COMM_ANT_CLE,
              Null,
              agc.AGC_CODE,
              ant.ANT_CODE
             )                                    CODE_FACT    ,
      Decode(
              com.COMM_ANT_CLE,
              Null,
              agc.AGC_ADRESSE1_FACT,
              ant.ANT_ADRESSE_FACT
             )                                    ADRESSE_FACT    ,
       Decode(com.COMM_ANT_CLE,
              Null,
              agc.AGC_CODE_POSTAL_FACT,
              ant.ANT_CODE_POSTAL_FACT
             )                                    CODE_POSTAL_FACT,
       Decode(
              com.COMM_ANT_CLE,
              Null,
              agc.AGC_COMMUNE_FACT,
              ant.ANT_COMMUNE_FACT
             )                                    COMMUNE_FACT    ,
       Decode(com.COMM_ANT_CLE,
              Null,
              agc.AGC_CODE_POSTAL_FACT
                || ' ' || agc.AGC_COMMUNE_FACT,
              ant.ANT_CODE_POSTAL_FACT
                || ' ' || ant.ANT_COMMUNE_FACT
             )                                    CP_COMMUNE_FACT    ,
       Decode(
              com.COMM_ANT_CLE,
              Null,
              agc.AGC_TEL_FACT,
              ant.ANT_TEL_FACT
             )                                    TEL_FACT        ,
       Decode(
              com.COMM_ANT_CLE,
              Null,
              agc.AGC_FAX_FACT,
              ant.ANT_FAX_FACT
             )                                    FAX_FACT        ,
       Nvl(
           com.COMM_NUMERO_FACTURE,
           lig.LIG_NUMERO_BL
          )                                       NUMERO_FACT     ,
       Decode(com.COMM_NUMERO_FACTURE,
              Null, 'XXXXX',
              '       XXXXXXXX'
             )                                    RATURE_FACT     ,
       Pkg_Lib_Prod.GetLibelleCourt(Lig_Prod_Code, Lig_LblC_Cle)    PROD_LIBELLE_COURT,
       Pkg_Lib_Prod.GetLibelleLong (Lig_Prod_Code, Lig_LblC_Cle)    PROD_LIBELLE_LONG ,
       Prod_Code_Agora                            PROD_CODE_AGORA ,
       -- AMAS 26/07/2005 CBT048 : ajout du code libellé commercial
       Lblc_Code                                  CODE_LBLC,
       -- Fin de modification
       Nvl(
           lig.LIG_QUANTITE_PREVUE,
           0
          )                                       QUANTITE_PREVUE ,
       'Au '                       ||
           pro.PROD_UNITE_VENTE    ||
           ' '                     ||
           uni.UNITE_LIBELLE_COURT || 's'         UNITE           ,
           uni.unite_code                         CODE_UNITE      ,
       nvl(Pkg_TarifsProduit.TarifProduit
            (
                COMM_SOC_CLE          ,
                COMM_AGC_CLE          ,
                COMM_ANT_CLE          ,
			          COMM_HT_TTC           ,
                COMM_NUMERO           ,
                COMM_FACTURE_BL_VALORISATION,
                LIG_PROD_CODE_FACTURE ,
                LIG_PROD_CODE         ,
                POST_DATE             ,
                COMM_CODE_CLIENT      ,
                COMM_ZT_CLE           ,
                COMM_DEV_CODE         ,
                LIG_PRIX_NEGOCIE      ,
                LIG_QUANTITE_LIVREE   ,
                LIG_QUANTITE_PREVUE   ,
                'TV'
            ),
           '      '
           )                                    PRIX_NEGOCIE      ,
       com.COMM_CIVILITE_CLIENT                         ||
           decode(com.COMM_CIVILITE_CLIENT,null,'',' ') ||
       com.COMM_NOM_CLIENT                      NOM_CLIENT        ,
       com.comm_numero                          NUM_CDE_COP       ,
       lig.LIG_ADRESSE_1_LIVRAISON                                ,
       lig.LIG_ADRESSE_2_LIVRAISON                                ,
       lig.LIG_CP_LIVRAISON                                       ,
       lig.LIG_COMMUNE_LIVRAISON                                  ,
       com.COMM_TELEPH_DOMICILE_CLIENT                            ,
       mdp.MODPAI_CODE                                            ,
       mdp.MODPAI_LIBELLE_COURT                                   ,
       del.DELAI_LIBELLE_COURT                                    ,
       com.COMM_COMMENT_FACTURE                                   ,
-- AMAS 10/08/05 TVDMS : commentaire tournée au lieu de commentaire facture sur le ticket volu DMS
       substr(com.COMM_COMMENT_TOURNEE,1,35)      COMMENT_TOUR1_35,
       substr(com.COMM_COMMENT_TOURNEE,36,70)     COMMENT_TOUR2_35,
       substr(com.COMM_COMMENT_TOURNEE,71,105)    COMMENT_TOUR3_35,
-- Fin de modification
       substr(com.COMM_COMMENT_FACTURE,1,35)      COMMENT_FACT1_35,
       substr(com.COMM_COMMENT_FACTURE,36,70)     COMMENT_FACT2_35,
       substr(com.COMM_COMMENT_FACTURE,71,105)    COMMENT_FACT3_35,
       substr(com.COMM_COMMENT_FACTURE,1,50)      COMMENT_FACT1_50,
       substr(com.COMM_COMMENT_FACTURE,51,100)    COMMENT_FACT2_50,
       To_Char(
               com.COMM_DATE_COMMANDE,
               'DD/MM/RRRR'
              )                                   DATE_COMMANDE   ,
       To_Char(
               pos.POST_HEURE_DEBUT,'DD/MM/RRRR'
              )                                   DATE_LIVRAISON  ,
       To_Char(
               pos.POST_HEURE_DEBUT
                    + nvl(DELAI_DECALAGE_DEPART,0)
                    + nvl(DELAI_DUREE_CREDIT,0)
                    + nvl(DELAI_DECALAGE_ARRIVEE,0),
               'DD/MM/RRRR'
              )                                   DATE_ECHEANCE   , -- Date de livraison + le délai de paiement
       Decode(
              Nvl
                 (
                  lig.LIG_HEURE_LIV_DEMANDEE_DEBUT -
                      trunc(lig.LIG_HEURE_LIV_DEMANDEE_DEBUT),
                  0
                 ),
              0,        -- colonne LIG_HEURE_LIV_DEMANDEE_DEBUT vide
              Decode(
                     Nvl(lig.LIG_HEURE_LIV_DEMANDEE_FIN -
                             trunc(lig.LIG_HEURE_LIV_DEMANDEE_FIN),
                         0
                        ),
                     0, -- colonne Lig_Heure_Liv_Demandee_Fin vide
                     Null,
                     'jusqu''à '    ||
                         To_Char(
                                 lig.LIG_HEURE_LIV_DEMANDEE_FIN,
                                            'HH24:MI'
                                )
                    ),
              Decode(
                     Nvl(
                         lig.LIG_HEURE_LIV_DEMANDEE_FIN -
                             Trunc(lig.LIG_HEURE_LIV_DEMANDEE_FIN),
                         0
                         ),
                     0, -- colonne Lig_Heure_Liv_Demandee_Fin vide
                     'à partir de ' ||
                         To_Char(
                                 lig.LIG_HEURE_LIV_DEMANDEE_DEBUT,
                                 'HH24:MI'
                                ),
                     'de '||
                         To_Char(
                                 lig.LIG_HEURE_LIV_DEMANDEE_DEBUT,
                                 'HH24:MI'
                                )   ||
                         ' à '      ||
                         To_Char(
                                 lig.LIG_HEURE_LIV_DEMANDEE_FIN,
                                 'HH24:MI'
                                )
                    )
             )                                    HORAIRE_LIVRAISON,
       veh.veh_immatriculation                    IMMAT_VEHICULE,
       veh.veh_code                               CODE_VEHICULE,
       chf.ch_nom || ' ' || chf.ch_prenom         NOM_CHAUFFEUR,
       chf.ch_code                                CODE_CHAUFFEUR,
       lig.lig_numero_bl                          NUM_BL,
       lig.lig_code_lieu                          CODE_LIEU,
       com.comm_nom_operatrice                    NOM_OPERATEUR,
       com.comm_code_client                       NUM_CLIENT,
       ssi.SSI_LIB_COURT                          SEC_COP,					--Champs ajouter pour ALVEA 2
       decode(nvl(LIG_CAPACITE_RESERVOIR,-1),
       -1,'',
       'CUVE : ' || LIG_CAPACITE_RESERVOIR || ' L'
       )                                          CUVE_VOL,                 --Champs ajouter pour ALVEA 2
       decode(nvl(LIG_CAPACITE_RESERVOIR,-1),
              -1,'',
              LIG_CAPACITE_RESERVOIR || ' L'
             )                                    CUVE_VOL_L,               --Champs ajouter pour CPO
       com.comm_numero_facture                    CLIENT_FACT,              --Champs ajouter pour ALVEA 2
       to_char(Nvl(
           lig.LIG_QUANTITE_PREVUE/1000,
           0
          ),'FM99990D990')                        QUANTITE_PREVUE_M3        --Champs ajouter pour ALVEA 2
From
       MODE_PAIEMENT        mdp,
       DELAI_PAIEMENT       del,
       UNITE                uni,
       PRODUIT              pro,
       AGENCE               agc,
       ANTENNE              ant,
       COMMANDE             com,
       LIGNE_DE_COMMANDE    lig,
       TOUR                 tou,
       POSTE                pos,
       VEHICULE             veh,
       CHAUFFEUR            chf,
	   SECTEUR_SI		    ssi,
	   -- AMAS 26/07/2005 CBT048 : ajout du code libellé commercial
	   LIBELLES_COMMERCIAUX lblc
Where
       lig.lig_lblc_cle      = lblc.lblc_cle   (+)
       -- Fin de modification
And    pos.POST_SOC_CLE      = tou.TOUR_SOC_CLE
And    pos.POST_CLE          = tou.TOUR_POST_CLE
And    tou.TOUR_SOC_CLE      = lig.LIG_SOC_CLE
And    tou.TOUR_CLE          = lig.LIG_TOUR_CLE
And    lig.LIG_SOC_CLE       = com.COMM_SOC_CLE
And    lig.LIG_COMM_CLE      = com.COMM_CLE
And    com.COMM_AGC_CLE      = agc.AGC_CLE
And    com.COMM_ANT_CLE      = ant.ANT_CLE     (+)
And    com.COMM_MODPAI_CLE   = mdp.MODPAI_CLE  (+)
And    com.COMM_DELAI_CLE    = del.DELAI_CLE   (+)
And    lig.LIG_PROD_CODE     = pro.PROD_CODE
And    pro.PROD_UNITE_CODE   = uni.UNITE_CODE
And    pos.post_veh_reel_cle = veh.veh_cle
And    chf.ch_cle (+) = nvl(pos.post_ch_reel_cle, pos.post_ch_prevu_cle)
And		lig.LIG_SSI_CLE = ssi.SSI_CLE
Lorsque je ne mets que des jointures externes dans tous les critères de ma requête, mon cout de requête est divisée par 37 !!!! (sur une base volumineuse)

Qq'un a-t-il une idée pour m'expliquer pourquoi une jointure externe est plus rapide qu'une jointure 'normale' ?

Merci d'avance
Cordialement