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 :

requête correlée lente


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut requête correlée lente
    Bonjour,
    J'ai une requete corrélée qui est trop lente à cause du not exists et la correlation dont le code est le suivant:
    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
     
    SELECT e.VEHICLE_SEQNO
     
          FROM GF_TRACING_EVENTS_WRK e, OB_JFO_PROCOP p
     
         WHERE e.JFO_SEQNO = p.JFO_SEQNO
     
           AND p.OPERATION_STATUS = 'EX'
     
           AND p.PROCOP_KIND IN ('DEC', 'SDL', 'TDL', 'PXD', 'DAT', 'WRK')
     
           AND NOT EXISTS (SELECT NULL
     
                             FROM OB_TRACE_EVENT e, OB_DEFAULT_EVENT de
     
                            WHERE e.EVENT_ID = de.EVENT_ID
     
                              AND e.EVENT_SUB_ID = de.EVENT_SUB_ID
     
                              AND SUBSTR(de.DEFAULT_EVENT_KIND, 1, 4) = 'END_'
     
                              AND e.PROCOP_SEQNO = p.PROCOP_SEQNO)
    Est ce qu'on peut réecrire cette requête en évitant la corrélation???
    Merci d'avance.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Il faut l'explain plan pour qu'on sache ce qui va pas.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Oui, le plan que j'ai eu avec l'autotrace traceonly est le suivant:
    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
     
    Elapsed: 00:09:21.87
     
    Execution Plan
    ----------------------------------------------------------                                                                             
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=7283 Card=73004 Byte                                                                 
              s=3358184)                                                                                                                   
     
       1    0   NESTED LOOPS (Cost=7283 Card=73004 Bytes=3358184)                                                                          
       2    1     TABLE ACCESS (FULL) OF 'GF_TRACING_EVENTS_WRK' (Cost=40                                                                  
              Card=72423 Bytes=1882998)                                                                                                    
     
       3    1     INLIST ITERATOR                                                                                                          
       4    3       INDEX (RANGE SCAN) OF 'JFOPROCOP_OPTIM_SB01' (NON-UNIQ                                                                 
              UE) (Cost=1 Card=1 Bytes=20)                                                                                                 
     
       5    4         TABLE ACCESS (BY INDEX ROWID) OF 'OB_DEFAULT_EVENT'                                                                  
              (Cost=2 Card=1 Bytes=32)                                                                                                     
     
       6    5           NESTED LOOPS (Cost=3 Card=1 Bytes=55)                                                                              
       7    6             TABLE ACCESS (BY INDEX ROWID) OF 'OB_TRACE_EVENT                                                                 
              ' (Cost=2 Card=4 Bytes=92)                                                                                                   
     
       8    7               INDEX (RANGE SCAN) OF 'TRACEEVENT_PROCOP' (NON                                                                 
              -UNIQUE) (Cost=4 Card=3)                                                                                                     
     
       9    6             INDEX (RANGE SCAN) OF 'DFLTEVENT_SUBEVENT_FK' (N                                                                 
              ON-UNIQUE) (Cost=1 Card=1)                                                                                                   
     
     
     
     
     
    Statistics
    ----------------------------------------------------------                                                                             
             12  recursive calls                                                                                                           
              0  db block gets                                                                                                             
        1502367  consistent gets                                                                                                           
          17503  physical reads                                                                                                            
           3796  redo size                                                                                                                 
            139  bytes sent via SQL*Net to client                                                                                          
            228  bytes received via SQL*Net from client                                                                                    
              1  SQL*Net roundtrips to/from client                                                                                         
              1  sorts (memory)                                                                                                            
              0  sorts (disk)                                                                                                              
              0  rows processed

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Le formatage de votre plan est difficile à lire. Essayez :
    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
     
    SELECT e.VEHICLE_SEQNO 
          FROM GF_TRACING_EVENTS_WRK e  
         WHERE e.JFO_SEQNO In (Select p.JFO_SEQNO 
                                 From OB_JFO_PROCOP p
                                where p.OPERATION_STATUS = 'EX' 
                                  AND p.PROCOP_KIND IN ('DEC', 'SDL', 'TDL', 'PXD', 'DAT', 'WRK')
                                  AND NOT EXISTS (SELECT NULL
                                                    FROM OB_TRACE_EVENT e, OB_DEFAULT_EVENT de
                                                   WHERE e.EVENT_ID = de.EVENT_ID
                                                     AND e.EVENT_SUB_ID = de.EVENT_SUB_ID
                                                     AND SUBSTR(de.DEFAULT_EVENT_KIND, 1, 4) = 'END_'
                                                     AND e.PROCOP_SEQNO = p.PROCOP_SEQNO)
                               )                       
    /

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Merci mnitu pour votre reponse, mais elle prend toujours un temps pas possible.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Dans votre première requête vous utilisez deux fois le même alias e.
    Impossible de savoir ce que vous cherchez à faire vraiment.

    C'est peut-être ça, peut-être pas ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT e.VEHICLE_SEQNO
      FROM GF_TRACING_EVENTS_WRK e
           INNER JOIN OB_JFO_PROCOP p
             ON p.JFO_SEQNO = e.JFO_SEQNO
     WHERE p.OPERATION_STATUS = 'EX'
       AND p.PROCOP_KIND IN ('DEC', 'SDL', 'TDL', 'PXD', 'DAT', 'WRK')
       AND NOT EXISTS (SELECT NULL
                         FROM OB_TRACE_EVENT te
                              INNER JOIN OB_DEFAULT_EVENT de
                                ON de.EVENT_ID     = te.EVENT_ID
                               AND de.EVENT_SUB_ID = te.EVENT_SUB_ID
                        WHERE de.DEFAULT_EVENT_KIND like 'END_%'
                          AND te.PROCOP_SEQNO = p.PROCOP_SEQNO);

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Merci waldar,
    je vais essayer, c peut etre ça!! je signale aussi que les tables OB_TRACE_EVENT ,OB_JFO_PROCOP sont tres volumineuses > 1 millard de lignes chacune, la table GF_TRACING_EVENTS_WRK fait 600 Milles.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 25
    Par défaut
    Bonjour Waldar,

    En fait j'ai testé votre ré-écriture, et ça marche mieux qu'avant.

    Merci.

    Citation Envoyé par Waldar Voir le message
    Dans votre première requête vous utilisez deux fois le même alias e.
    Impossible de savoir ce que vous cherchez à faire vraiment.

    C'est peut-être ça, peut-être pas ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT e.VEHICLE_SEQNO
      FROM GF_TRACING_EVENTS_WRK e
           INNER JOIN OB_JFO_PROCOP p
             ON p.JFO_SEQNO = e.JFO_SEQNO
     WHERE p.OPERATION_STATUS = 'EX'
       AND p.PROCOP_KIND IN ('DEC', 'SDL', 'TDL', 'PXD', 'DAT', 'WRK')
       AND NOT EXISTS (SELECT NULL
                         FROM OB_TRACE_EVENT te
                              INNER JOIN OB_DEFAULT_EVENT de
                                ON de.EVENT_ID     = te.EVENT_ID
                               AND de.EVENT_SUB_ID = te.EVENT_SUB_ID
                        WHERE de.DEFAULT_EVENT_KIND like 'END_%'
                          AND te.PROCOP_SEQNO = p.PROCOP_SEQNO);

Discussions similaires

  1. [MySQL] Optimisation requête, affichage lent
    Par Yann39 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/10/2008, 11h23
  2. Requête trop lente
    Par shadeoner dans le forum SQL
    Réponses: 11
    Dernier message: 23/05/2008, 10h24
  3. Requête trop lente, comment l'optimiser?
    Par getz85 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 29/01/2008, 13h40
  4. auto-killer une requête trop lente
    Par Nico57 dans le forum Oracle
    Réponses: 5
    Dernier message: 05/12/2006, 18h04
  5. Pourquoi cette requête est lente ?
    Par zenzo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/01/2006, 15h15

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