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

SQL Oracle Discussion :

Optimisation requête


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 544
    Points : 1 748
    Points
    1 748
    Par défaut Optimisation requête
    Bonjour ,
    Je doit optimiser les procédures utilisées par une application qui utilise une requête bourine

    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
    UPDATE hist_chemin T1 
    SET
     
    T1.cout_degr_pal1_init= (SELECT T2.cout1_init
      FROM hist_chemin_plan_transport T2
      WHERE t2.hist_date = dateLastHistDATE
      AND T2.seq_chemin   = T1.seq_chemin
      ) ,
     
     T1.cout_degr_pal2_init= (SELECT T2.coutl2_init
      FROM hist_chemin_plan_transport T2
      WHERE t2.hist_date = dateLastHistDATE
      AND T2.seq_chemin   = T1.seq_chemin
      )   ,
     
       T1.cout_degr_pal3_init= (SELECT T2.cout3_init
      FROM hist_chemin_plan_transport T2
      WHERE t2.hist_date = dateLastHistDATE
      AND T2.seq_chemin   = T1.seq_chemin
      )   ,
     
       T1.cout_degr_pal4_init= (SELECT T2.cout4_init
      FROM hist_chemin_plan_transport T2
      WHERE t2.hist_date = dateLastHistDATE
      AND T2.seq_chemin   = T1.seq_chemin
      )   ,
       T1.cout_degr_pal5_init= (SELECT T2.coutal5_init
      FROM hist_chemin_plan_transport T2
      WHERE t2.hist_date = dateLastHistDATE
      AND T2.seq_chemin   = T1.seq_chemin
      )   ...
    Comme vous vous en doutez, sur une table de 2 millions de lignes ça prend 2 heures, je cherche une piste d'optimisation.
    J'ai trouvé avec les curseurs, j’aimerais savoir si cette solution est idéale, car il ne faut pas que je me trompe

    Cordialement

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Tente l'instruction MERGE.

  3. #3
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 544
    Points : 1 748
    Points
    1 748
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut,

    Tente l'instruction MERGE.
    je pense que ce sont surtout les select au sein de chaque set qui ralentissent

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Oubliez les curseurs. MERGE est intéressant à tester.
    Néanmoins, du peu qu'on voit vous pouvez déjà réécrire votre requête ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE hist_chemin T1 
       SET (T1.cout_degr_pal1_init, T1.cout_degr_pal2_init, T1.cout_degr_pal3_init, T1.cout_degr_pal4_init, T1.cout_degr_pal5_init)
         = (SELECT T2.cout1_init  , T2.coutl2_init        , T2.coutl3_init        , T4.coutl2_init        , T5.coutl2_init
              FROM hist_chemin_plan_transport T2
             WHERE t2.hist_date  = dateLastHistDATE
               AND T2.seq_chemin = T1.seq_chemin)
    ...

  5. #5
    Membre expérimenté Avatar de dfiad77pro
    Homme Profil pro
    Responsable Architecture logicielle
    Inscrit en
    Décembre 2008
    Messages
    544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable Architecture logicielle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 544
    Points : 1 748
    Points
    1 748
    Par défaut
    merci, c'est déjà 5 fois plus rapide , mais encore un peu lent. Bon la requête s'exécute une fois par mois

  6. #6
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    Bonjour,
    Pour aller plus loin il faudrait voir le plan de cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SET TIMIN ON
    alter session set statistics_level=ALL;
     
    UPDATE hist_chemin T1 
       SET (T1.cout_degr_pal1_init, T1.cout_degr_pal2_init, T1.cout_degr_pal3_init, T1.cout_degr_pal4_init, T1.cout_degr_pal5_init)
         = (SELECT T2.cout1_init  , T2.coutl2_init        , T2.coutl3_init        , T4.coutl2_init        , T5.coutl2_init
              FROM hist_chemin_plan_transport T2
             WHERE t2.hist_date  = dateLastHistDATE
               AND T2.seq_chemin = T1.seq_chemin);
     
    SET LINES 500
    SET PAGES 500
    select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

  7. #7
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,

    Ta requête initiale met à NULL les lignes qui n'ont pas de correspondance.
    Si tu peux te passer cette mise à NULL, tente le MERGE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MERGE INTO hist_chemin T1
    USING (SELECT cout1_init, coutl2_init, coutl3_init, coutl2_init,coutl2_init
           FROM hist_chemin_plan_transport) T2
    ON (t2.hist_date  = dateLastHistDATE AND T2.seq_chemin = T1.seq_chemin)
    WHEN MATCHED THEN UPDATE SET
    T1.cout_degr_pal1_init = T2.cout1_init, T1.cout_degr_pal2_init=T2.coutl2_init
    , T1.cout_degr_pal3_init = T2.coutl3_init , T1.cout_degr_pal4_init = T2.coutl2_init, T1.cout_degr_pal5_init = T2.coutl2_init

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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