IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Performance requete SQL


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut Performance requete SQL
    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

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je ne sais pas pour les autres, mais pour moi, il est hors de question que je lise une requête aussi longue sans la moindre trace d'indentation (et accessoirement sans utiliser la balise [code]), ne serait-ce que pour toi.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Bonjour et bienvenue, d'abord, veuillez penser aux balises code à l'avenir, c'est bien plus lisible que l'italique

    N'y a-t-il pas de produit cartésien dans cette requête ? Quel est le plan d'exécution ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Je résume la situation, la requête de création d'une vue est extrèmement longue.
    La seule manière de réduire le temps de création qua j'ai trouvé est de mettre des jointures externes entre toutes les tables qui sont présentes dans le script de création de la vue.
    Ma question est :
    Pourquoi en mettant des jointures systématiquement ma requête est plus rapide ?

    Merci d'avance

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    La question que je me poserais en premier serait de savoir si les 2 requêtes ramenent exactement le même nombre de lignes.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

Discussions similaires

  1. Performance requetes SQL/JDBC
    Par st20085 dans le forum JDBC
    Réponses: 6
    Dernier message: 24/03/2011, 11h10
  2. Performance requete SQL
    Par cyclopsnet dans le forum SQL
    Réponses: 14
    Dernier message: 26/11/2010, 10h29
  3. Question performance sur requetes sql
    Par shinrei dans le forum ASP
    Réponses: 7
    Dernier message: 19/05/2006, 13h28
  4. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo