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

PL/SQL Oracle Discussion :

[9i] tuning : comportement bizarre


Sujet :

PL/SQL Oracle

  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut [9i] tuning : comportement bizarre
    Salut

    Je viens à vous pour vous faire part d'un comportement étrange de l'optimizer d'oracle, je souhaite comprendre pourquoi ses décisions changent pour 2 requêtes (explain plan) alors que visiblement il n'y a aucun changement logique entre les 2.

    Voici les requêtes, je vous les mets en entier car je ne sais pas trop si les simplifier serait une bonne chose pour le fond du problème.
    La seule différence entre les 2 est mise en caractères gras :

    REQUETE 1:

    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
                SELECT
                    ampaclav clav,
                    CASE 
                        WHEN ampaesta||AMPAMARC||AMPATIPO||SUBSTR(AMPACTAC,1,4) = '0138889' THEN ' '
                        ELSE SUBSTR(TO_CHAR(ampactac),1,4) || '/' || SUBSTR(TO_CHAR(ampactac),5,4) || SUBSTR(TO_CHAR(ampactac),10)
                    END NumCuenta,  
                    a.RELACLA2 NumTarjeta, 
                    SUBSTR(a.RELACLA2,3,4) || ' ' || SUBSTR(a.RELACLA2,7,4) || ' XXXX ' || SUBSTR(a.RELACLA2,15,4) Tarjeta,
                    DECODE(ampaesta||AMPAMARC||AMPATIPO||SUBSTR(AMPACTAC,1,4),'0138889','CORPORATE',SUBSTR(pdudata,41,LENGTH(pdudata)-42)) Tipo,
                    CASE 
                        WHEN SUBSTR(a.RELACLA2,3,6) = '459992' THEN 'A'
                        WHEN SUBSTR(a.RELACLA2,3,6) = '459993' THEN 'A'
                        WHEN SUBSTR(a.RELACLA2,3,6) = '459994' THEN 'D'
                        WHEN SUBSTR(a.RELACLA2,3,6) = '603977' THEN 'C'
                    END Modo
                FROM golf.PDU,
                     golf.rela a, 
                     golf.ampa, 
                     golf.pers
                WHERE 
                    PDUTBLA = 'MPBINES' 
                AND SUBSTR(a.RELACLA2,3,6) = pduclav
                AND ampaclav = SUBSTR(a.RELACLA2,3) 
                AND persnume = RELACLA1
                AND 
                    (
                    a.RELAMAE1 = 'PERS' 
                AND a.RELAMAE2 = 'AMPA' 
                AND    
                       (    a.RELACLA1 = LPAD(ParCliente,18, '0') 
                        AND perssexo < 5) 
                     OR       
                       (
                            RELACLA1 = persnume  
                        AND ampatita = 'B'    
                        AND SUBSTR(ampaclav,1,13) IN 
                           (
                            SELECT SUBSTR(ampaclav,1,13) FROM golf.ampa 
                            WHERE ampaclav IN 
                                 (
                                  SELECT SUBSTR(RELACLA2,3) FROM golf.rela, golf.pers
                                  WHERE RELACLA1 = LPAD(ParCliente,18,'0')
                                  AND persnume = RELACLA1 
                                  AND RELAMAE1 = 'PERS' 
                                  AND RELAMAE2 = 'AMPA' 
                                  AND TO_NUMBER(RELACLA1) = persnume 
                                  AND perssexo > 5 
                                  AND ampatita = 'P'
                                 )
                           )
                       )
                    )
                ORDER BY ampactac
    REQUETE 2:

    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
                SELECT
                    ampaclav clav,
                    CASE 
                        WHEN ampaesta||AMPAMARC||AMPATIPO||SUBSTR(AMPACTAC,1,4) = '0138889' THEN ' '
                        ELSE SUBSTR(TO_CHAR(ampactac),1,4) || '/' || SUBSTR(TO_CHAR(ampactac),5,4) || SUBSTR(TO_CHAR(ampactac),10)
                    END NumCuenta,  
                    a.RELACLA2 NumTarjeta, 
                    SUBSTR(a.RELACLA2,3,4) || ' ' || SUBSTR(a.RELACLA2,7,4) || ' XXXX ' || SUBSTR(a.RELACLA2,15,4) Tarjeta,
                    DECODE(ampaesta||AMPAMARC||AMPATIPO||SUBSTR(AMPACTAC,1,4),'0138889','CORPORATE',SUBSTR(pdudata,41,LENGTH(pdudata)-42)) Tipo,
                    CASE 
                        WHEN SUBSTR(a.RELACLA2,3,6) = '459992' THEN 'A'
                        WHEN SUBSTR(a.RELACLA2,3,6) = '459993' THEN 'A'
                        WHEN SUBSTR(a.RELACLA2,3,6) = '459994' THEN 'D'
                        WHEN SUBSTR(a.RELACLA2,3,6) = '603977' THEN 'C'
                    END Modo
                FROM golf.PDU,
                     golf.rela a, 
                     golf.ampa, 
                     golf.pers
                WHERE 
                    PDUTBLA = 'MPBINES' 
                AND SUBSTR(a.RELACLA2,3,6) = pduclav
                AND ampaclav = SUBSTR(a.RELACLA2,3) 
                AND persnume = RELACLA1
                AND a.RELAMAE1 = 'PERS'
                AND a.RELAMAE2 = 'AMPA'
                AND
                    (    
                       (    a.RELACLA1 = LPAD(ParCliente,18, '0') 
                        AND perssexo < 5) 
                     OR       
                       (
                            RELACLA1 = persnume  
                        AND ampatita = 'B'    
                        AND SUBSTR(ampaclav,1,13) IN 
                           (
                            SELECT SUBSTR(ampaclav,1,13) FROM golf.ampa 
                            WHERE ampaclav IN 
                                 (
                                  SELECT SUBSTR(RELACLA2,3) FROM golf.rela, golf.pers
                                  WHERE RELACLA1 = LPAD(ParCliente,18,'0')
                                  AND persnume = RELACLA1 
                                  AND RELAMAE1 = 'PERS' 
                                  AND RELAMAE2 = 'AMPA' 
                                  AND TO_NUMBER(RELACLA1) = persnume 
                                  AND perssexo > 5 
                                  AND ampatita = 'P'
                                 )
                           )
                       )
                    )
                ORDER BY ampactac
    Le changement, comme vous pouvez le constater, est très simple. On a un séquent de type

    (A and (B AND (C OR D)))
    qu'on transforme en
    (A and B AND (C OR D))

    Cependant, les explains plan sont différent, dans un cas il utilise un FULL FAST INDEX SCAN d'un index non unique, dans l'autre il utilise un RANGE INDEX SCAN d'un index non unique non plus. Ce sont les 2 seules différences entre les explains plan.

    Je ne comprends pas, je n'ai fait que sortir d'une parenthèse une expression basique ...

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Comment fait-vous pour comparer les plans ? Ma question veut en faire dire : est vous certain que la seule chose qui change est seulement le texte de la requête et que tous les autres paramètres de la session sont identiques ?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    j'utilise l'outil pl/sql developper

    j'ouvre une seule instance, une seule connexion donc

    2 explain plan windows, avec les 2 requêtes précédemment citées

    F5 sur l'une, F5 sur l'autre

    j'exporte les résultats obtenus et je les colle sous excel pour pouvoir comparer ligne à ligne, ce qui m'a mené aux observations vues plus haut et seulement celles-là

  4. #4
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Il y aurait 2 chose interresantes à tester:
    1- comparer les filter/access predicates des 2 plans d'exécution
    2- forcer à avoir les mêmes plans avec un hint ( index_ffs() ou index() ) et comparer les couts/cardinalités estimées
    Cordialement,
    Franck.

  5. #5
    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

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Ahmed AANGOUR Voir le message
    Franchement je ne vois pas le lien avec le problème en question.

  7. #7
    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
    la question que je me posais est: est-ce que le fait de rajouter une parenthèse dans la clause where ne modifie pas l'ordre des clauses évaluées par le CBO ce qui impacterait les cardinalités estimées et donc le plan.

    Il faudrait comparer les filter/access predicates pour les 2 plans

Discussions similaires

  1. Comportement bizarre de mes FPS
    Par Ekinoks dans le forum OpenGL
    Réponses: 7
    Dernier message: 22/08/2005, 15h14
  2. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 13h56
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 10h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 15h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

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