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 :

[Oracle 9.2.0.6] Explain Plan : question de débutant


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [Oracle 9.2.0.6] Explain Plan : question de débutant
    Bonjour à tous

    J'essaie actuellement d'optimiser quelques requêtes. Pour cela, je me sers de l'explain plan.
    Voilà mon problème, j'ai une requête avec un explain plan propre. Je passe bien par les index, j'ai uniquement un access full sur un table (normal, j'ai un count distinct sur une de ses colonnes). L'explain plan me renvoie un cost de 1300.
    Dans ce cas, la requête me retourne le résultat en 2 minutes.

    En suite, je reprend ma requête. Je modifie ma clause where (je change les join pour prendre un autre chemin).
    A ce moment là, l'explain plan me dit : 5 access full et uniquement 1 index unique scan et un cost de 8700. Compte tenu de ma modif, c'est normal car le chemin est plus long.

    MAIS, quand j'exécute la requête avec ces modifs, j'ai le résultat au bout de 20 secondes !!!!


    Ma question est la suivante : ai je un problème ;-) ? Jusqu'où peut on faire confiance à l'explain plan ?

    Je ne suis pas DBA (et ne compte pas le devenir) mais j'aimerais comprendre.

    Merci à tous pour vos contributions.
    Cordialement

    Benoit

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juin 2002
    Messages : 66
    Points : 57
    Points
    57
    Par défaut Re: [Oracle 9.2.0.6] Explain Plan : question de débutant
    Citation Envoyé par BenCar
    Bonjour à tous

    J'essaie actuellement d'optimiser quelques requêtes. Pour cela, je me sers de l'explain plan.
    Voilà mon problème, j'ai une requête avec un explain plan propre. Je passe bien par les index, j'ai uniquement un access full sur un table (normal, j'ai un count distinct sur une de ses colonnes). L'explain plan me renvoie un cost de 1300.
    Dans ce cas, la requête me retourne le résultat en 2 minutes.

    En suite, je reprend ma requête. Je modifie ma clause where (je change les join pour prendre un autre chemin).
    A ce moment là, l'explain plan me dit : 5 access full et uniquement 1 index unique scan et un cost de 8700. Compte tenu de ma modif, c'est normal car le chemin est plus long.

    MAIS, quand j'exécute la requête avec ces modifs, j'ai le résultat au bout de 20 secondes !!!!


    Ma question est la suivante : ai je un problème ;-) ? Jusqu'où peut on faire confiance à l'explain plan ?

    Je ne suis pas DBA (et ne compte pas le devenir) mais j'aimerais comprendre.

    Merci à tous pour vos contributions.
    Cordialement

    Benoit
    montre tes deux requetes et tes explain plans ...

    il se peut que tes statistiques ne soient pas mises à jour ....

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Voici la 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    SELECT   COUNT (DISTINCT CASE
                       WHEN t32385.opty_wid > 0
                          THEN t32385.opty_wid
                    END) AS c1,
             t32577.stg_name AS c2, t43873.camp_name AS c3,
             t220742.attrib_01 AS c4, t43873.camp_src_num AS c5,
             t43873.camp_type AS c6, t220742.attrib_21 AS c7
        FROM w_opty_d t31547,
             w_revn_f t32385,
             w_sstage_d t32577,
             w_source_d t43873,
             w_opty_dx t204383,
             w_source_dx t220742
       WHERE (    t32385.source_wid = t43873.row_wid
              AND
                  --T32385.OPTY_WID = T204383.ROW_WID and
                  t31547.row_wid = t32385.opty_wid
              AND t31547.row_wid = t204383.row_wid
              AND
                  --T32385.SOURCE_WID=T220742.ROW_WID  and
                  t43873.row_wid = t220742.row_wid
              AND t32385.curr_sstage_wid = t32577.row_wid
             )
    GROUP BY t32577.stg_name,
             t43873.camp_name,
             t43873.camp_src_num,
             t43873.camp_type,
             t220742.attrib_21,
             t220742.attrib_01
    Cette requête est celle qui s'éxécute en moins de 20 secondes. Pour avoir l'autre, il suffit d'enlever les commentaires dans la clause where.
    Voici son explain plan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT STATEMENT Optimizer Mode=CHOOSE		594 K	 	8690  	 	      	             	 
    SORT GROUP BY		594 K	44 M	8690  	 	      	              
    NESTED LOOPS		594 K	44 M	1386  	 	      	              
    NESTED LOOPS		596 K	42 M	1386  	 	      	              
    HASH JOIN		596 K	39 M	1386  	 	      	             	 
    TABLE ACCESS FULL	SIEBEL.W_SSTAGE_D	7  	63  	2  	         
    HASH JOIN		596 K	34 M	1380  	 	      	             	 
    HASH JOIN		2 K	121 K	25  	 	      	             	 
    TABLE ACCESS FULL	SIEBEL.W_SOURCE_DX	2 K	34 K	2  	 
    TABLE ACCESS FULL	SIEBEL.W_SOURCE_D	2 K	86 K	22  	  
    TABLE ACCESS FULL	SIEBEL.W_REVN_F	596 K	6 M	1334  	  
    INDEX UNIQUE SCAN	SIEBEL.W_OPTY_D_P1	1  	5  	 	 
    INDEX UNIQUE SCAN	SIEBEL.W_OPTY_DX_P1	1  	5
    L'explain plan de la requête de base (celle qui prend 2 mn) 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
    SELECT STATEMENT Optimizer Mode=CHOOSE		1  	 	1342  	 	      	             	 
    SORT GROUP BY		1  	79  	1342  	 	      	             
    NESTED LOOPS		1  	79  	1339  	 	      	             
    NESTED LOOPS		1  	70  	1338  	 	      	             
    NESTED LOOPS		2  	70  	1336  	 	      	             
    NESTED LOOPS		2  	42  	1334  	 	      	             
    NESTED LOOPS		596 K	9 M	1334  	 	      	             
    TABLE ACCESS FULL	SIEBEL.W_REVN_F	596 K	6 M	1334  	 
    INDEX UNIQUE SCAN	SIEBEL.W_OPTY_DX_P1	1  	5  	 	 
    INDEX UNIQUE SCAN	SIEBEL.W_OPTY_D_P1	1  	5  	 	 
    TABLE ACCESS BY INDEX ROWID	SIEBEL.W_SOURCE_DX	1  	14  	1
    INDEX UNIQUE SCAN	SIEBEL.W_SOURCE_DX_P1	1  	 	 
    TABLE ACCESS BY INDEX ROWID	SIEBEL.W_SOURCE_D	1  	35  	1
    INDEX UNIQUE SCAN	SIEBEL.W_SOURCE_D_P1	1  	 	 
    TABLE ACCESS BY INDEX ROWID	SIEBEL.W_SSTAGE_D	1  	9  	1 
    INDEX UNIQUE SCAN	SIEBEL.W_SSTAGE_D_P1	1
    Toutes les statistiques sont à jour. J'ai un programme qui lance les analyses tous les matins.

  4. #4
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Merci d'éditer votre dernier message pour y intégrer les balises [ code ] et [ quote ] (sans les espaces) ;-)

    Sinon, je ne vois pas en quoi ça vous surprend que 5 ACCESS FULL soient plus lents qu'un seul ???

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Désolé pour les balises. C'est mon premier message. je ne suis pas encore habitué.

    Ce qui me gêne, c'est que justement c'est le contraire. La requête est plus rapide avec 5 access full qu'avec un seul !

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il y a 2 problèmes : le TBS sur W_REVN_F et le tri

    est-ce que tu as un index sur (t32385.source_wid,t32385.curr_sstage_wid) ?

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui, j'ai deux index :
    W_REVN_F_F15 sur CURR_SSTAGE_WID
    et
    W_REVN_F_F29 sur SOURCE_WID

    Qu'entends tu par :
    "il y a 2 problèmes : le TBS sur W_REVN_F et le tri" ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    TFS et pas TBS Table Full Scan

    Essaye d'ajouter un index avec les 2 colonnes et si ça ne suffit pas ajoute un hint : /*+ indexes(tab,ind) */

    Pour le tri, bah c'est le GROUP BY qui consomme énormémement aussi... regarde les couts pour chacune des lignes pour repérer celles où le coùt est le plus important

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    J'ai ajouté l'index mais il ne le prend pas en compte même avec un hint.
    Par contre, j'en ai créé un avec les 3 colonnes suivante : SOURCE_WID,OPTY_WID ET CURR_SSTAGE_WID.
    Là, il passe bien par ce nouvel index et j'obtiens un cost de 9.
    Voici l'explain plan

    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 STATEMENT Optimizer Mode=CHOOSE		1  	 	9 
    SORT GROUP BY		1  	75  	9  	 	      	             	 
    NESTED LOOPS		1  	75  	6  	 	      	             	 
    NESTED LOOPS		2  	122  	4  
    NESTED LOOPS		2  	52  	2  	 	      	             	 
    NESTED LOOPS		596 K	11 M	2  	 	      	             
    NESTED LOOPS		596 K	9 M	2  
    TABLE ACCESS FULL	SIEBEL.W_SSTAGE_D	7  	63  	2  
    INDEX FULL SCAN	SIEBEL.TEST_DEV	85 K	582 K	 	 
    INDEX UNIQUE SCAN	SIEBEL.W_OPTY_D_P1	1  	5  	 
    INDEX UNIQUE SCAN	SIEBEL.W_OPTY_DX_P1	1  	5  	  
    TABLE ACCESS BY INDEX ROWID	SIEBEL.W_SOURCE_D	1  	35  	1  
    INDEX UNIQUE SCAN	SIEBEL.W_SOURCE_D_P1	1  	 
    TABLE ACCESS BY INDEX ROWID	SIEBEL.W_SOURCE_DX	1  	14  	1 
    INDEX UNIQUE SCAN	SIEBEL.W_SOURCE_DX_P1	1
    La requête est rapide (9 secondes).
    Merci de ton aide.
    Je vais encore la travailler pour voir si je peux éliminer le dernier Table Access Full.

    Jusqu'où peut on faire confiance à l'explain plan.
    Maintenant, il est logique dans le sens où le côut annoncé est faible et que son temps d'exécution est plus rapide.

    Mais avant j'avais le contraire.
    Quelques conseils ??

    Encore merci de ton aide.

  10. #10
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Citation Envoyé par BenCar
    Jusqu'où peut on faire confiance à l'explain plan.
    Maintenant, il est logique dans le sens où le côut annoncé est faible et que son temps d'exécution est plus rapide.
    c'est faux, un cout de explain plan faible ne veut pas dire un temps d'executions plus rapide.

  11. #11
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    OK
    Alors à quoi faut il être attentif sur l'explain plan ?

    Dans mon cas, j'avais un plan avec 5 table access full qui était plus rapide que celui avec 1 seul table access full pour le même résultat.

    Merci pour vos éclaircissements.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par bouyao
    Citation Envoyé par BenCar
    Jusqu'où peut on faire confiance à l'explain plan.
    Maintenant, il est logique dans le sens où le côut annoncé est faible et que son temps d'exécution est plus rapide.
    c'est faux, un cout de explain plan faible ne veut pas dire un temps d'executions plus rapide.
    Certes mais c'est quand même très souvent le cas

    Le coût est calculé selon le nombre de bloc à lire pour récupérer l'info il me semble. En gros, meilleur est le cout, meilleur est le plan d'exécution mais un index mal choisi peut leurrer Oracle.

    Le plan d'exécution permet justement de mettre en lumière des indexes peu intéressant comme c'était ton cas

  13. #13
    Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci orafrance pour ton aide.

  14. #14
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    c'est faux, un cout de explain plan faible ne veut pas dire un temps d'executions plus rapide.
    Exactement , cela fait partie des idées recu ,
    comme le fait qu'un FTS est plus rapide qu'un accées indéxes .

    Si vous connaissez vos données , et que l'explain plan vous montre un FTS sur une grosse table dans ce cas OK , sinon le juge de paix reste en réghle génèral le temps d'éxècution .

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

Discussions similaires

  1. [Tuning] Importer un explain plan
    Par aline dans le forum Oracle
    Réponses: 2
    Dernier message: 26/07/2006, 11h23
  2. Explain Plan
    Par claralavraie dans le forum Oracle
    Réponses: 28
    Dernier message: 22/05/2006, 17h52
  3. Oracle9i explain plan for
    Par mohmanjdo dans le forum Oracle
    Réponses: 1
    Dernier message: 12/05/2006, 06h12
  4. [9.2] Explain Plan
    Par nako dans le forum Oracle
    Réponses: 9
    Dernier message: 09/01/2006, 10h52
  5. TKPROF et Explain Plan
    Par kamalito dans le forum Oracle
    Réponses: 7
    Dernier message: 27/10/2005, 11h54

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