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

  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
    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
    Vos tables sont-elles partitionnées ?
    Sont-elles compressées ?
    Quels sont les index dessus ?

    Vous êtes sûr de vos volumétrie ? D'après votre explain plan votre table GF_TRACING_EVENTS_WRK ne fait que 72.000 lignes, pas 600.000.
    Vos statistiques sont-elles à jour ?

  9. #9
    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
    Citation Envoyé par Waldar Voir le message
    Vos tables sont-elles partitionnées ?
    Sont-elles compressées ?
    Quels sont les index dessus ?

    Vous êtes sûr de vos volumétrie ? D'après votre explain plan votre table GF_TRACING_EVENTS_WRK ne fait que 72.000 lignes, pas 600.000.
    Vos statistiques sont-elles à jour ?
    Statistiques non représentatives => Estimation erronées des cardinalités => Chemin d’accès dégradé => Méthodes de jointures dégradées => Ordre de jointure dégradé => Temps d’exécution dégradés

  10. #10
    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
    Effectivement, vous avez raison, les stats sont obsolètes, sinon y'a-t-il une autre façon d'eviter la correlation en faisant une jointure par exemple ou autre ???
    Merci à tous pour votre coup de main

  11. #11
    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);

  12. #12
    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
    Il n'y a aucun soucis à écrire une requête corrélée.
    Mais dès lors que vos stats sont trop loin de la réalité, n'importe quelle requête peut se mettre à mouliner sans raison.

    On peut écrire la même requête en utilisant une jointure externe, mais les plans sont quasi-similaires.

    Bref : rafraîchissez vos statistiques !

    Quant à ma requête, je ne suis pas sûr que ce soit ce que vous vouliez faire, j'ai modifié les deux alias "e", je ne suis pas certain d'avoir fait les bons choix.

  13. #13
    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
    En fait c'est une requête qui provient d'un progiciel, je ne sais pas ce qu'elle fait, et on me demande de la tuner sans toucher au stats. c'est spécial!!
    cdt.

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Si c'est un problème des statistiques et que tu n'as pas le droit de toucher aux statistiques :
    - Rafraîchis les stats sur ton environnement de test (si tu veux, tu peux sauvegarder les anciennes)
    - Exécuter la requête, et regarde le nouveau plan
    - Mets des hints dans ta requête pour que ça fasse la même chose avec les stats pourries...

    (c'est sale, mais vu que tu as un peu les poings liés...)

    Tu peux aussi tenter le dynamic sampling ?

    PS : oh Waldar, t'es devenu modérateur ! Félicitations

  15. #15
    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 pour tes précisions, (tenter le dynamic sampling) ça sert à quoi exactement, et en plus je ne sais pas faire !!!

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Le dynamic sampling, c'est le fait d'échantilloner les tables soit parce que tes statistiques n'existent pas, soit parce que le CBO utilise des hypothèses inappropriées pour estimer la cardinalité résultant d'un ou plusieurs prédicats, ...

    Tu as un paramètre que tu peux modifier (en alter session par exemple) :
    ALTER SESSION SET OPTIMIZER_DYNAMIC_SAMPLING=2

    Ou utiliser un hint :
    /*+dynamic_sampling(t,2)*/

    Le "2", c'est un paramètre qui indique dans quels cas ce sera fait, et combien il va échantillonner.

    Je te laisse chercher un peu et te documenter sur le net, par exemple :
    http://www.oracle.com/technology/ora...o19asktom.html

  17. #17
    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 pacmann.

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