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 :

Explication sur un plan d'exécution


Sujet :

SQL Oracle

  1. #1
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut Explication sur un plan d'exécution
    Bonjour.

    je suis 10g sous 2k3 Server.
    J'ai une requête dont je ne parviens à m'expliquer le plan d'exécution.

    Voici le plan d'exécution étant entendu que
    - la table P a un inex sur A
    - la table CIZ a un index sur A et un index sur B
    - j'ai exécuté les commandes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     alter table CIZ move;
     alter index CIZ.IndexSurA rebuild;
     alter index CIZ.IndexSurB rebuild;
     execute dbms_stat.gather_table_stats ('CIZ');
    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
    >explain plan for select * from p inner join ciz on (ciz.a = p.a and ciz.b = 113);
     
    ExplicitÚ.
     
    >select plan_table_output from table(dbms_xplan.display());
     
    PLAN_TABLE_OUTPUT
    -------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 362659792
     
    --------------------------------------------------------------------------------------------
    | Id  | Operation          | Name          | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |               |   256K|    36M|       |  8703   (2)| 00:01:45 |
    |*  1 |  HASH JOIN         |               |   256K|    36M|    11M|  8703   (2)| 00:01:45 |
    |   2 |   TABLE ACCESS FULL| P             | 90526 |    10M|       |   322   (2)| 00:00:04 |
    |*  3 |   TABLE ACCESS FULL| CIZ           |  1771K|    55M|       |  4030   (3)| 00:00:49 |
    --------------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - access("CIZ"."a"="P"."a")
       3 - filter("CIZ"."b"=113)
     
    16 ligne(s) sÚlectionnÚe(s).
    Malgré tout, j'ai un FULL ACCESS TABLE sur CIZ.

    Ce que je ne comprends pas, c'est, d'une part, pourquoi oracle n'utilise pas l'index CIZ.IndexSurB.
    D'autre part, le full access est-il vraiment sur la table ou bien sur le résultat de la jointure.

    Merci de vos lumières.

    Olivier

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Quelle est la sélectivité du filtre sur b ?
    Si ça garde une grosse partie des lignes, alors il est plus rapide d'accéder à la table plutôt que d'accéder à l'index, puis pour chaque ligne indiquée par l'index aller chercher la ligne dans la table.


    EDIT: s'il y a peu de colonnes réellement utiles dans la requête, il est possible de les inclure dans l'index (qui sera alors couvrant), pour ne pas avoir à faire l'aller-retour entre la table et l'index. Mais bien sûr, cela a un coût : à la fois en place et en temps de mise à jour de l'index.

  3. #3
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Hello,
    Idem Rei Ichido.
    Combien de lignes pour le critère b=113 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select count(*) from ciz where b=113;
    select count(*) from ciz;
    Si beaucoup de lignes le full est justifié.
    Si non, il manque peut être un histogramme sur la colonne b.

  4. #4
    Membre habitué

    Inscrit en
    Octobre 2003
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 178
    Points : 133
    Points
    133
    Par défaut
    Effectivement, je n'y avais pas fait attention, mais ce filtre ramène 46% des 4 millions de lignes de la table.
    En regardant le chiffre plan, je crois que du coup, ça répond aussi à ma deuxième question.

    Quant à modifier l'index, je ne peux pas le faire

    Merci beaucoup à tous les deux.

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

Discussions similaires

  1. Aide sur un plan d'exécution
    Par canabral dans le forum SQL
    Réponses: 8
    Dernier message: 16/10/2015, 13h56
  2. Explication sur plan d'exécution
    Par gjaisp dans le forum Oracle
    Réponses: 1
    Dernier message: 26/08/2010, 13h33
  3. Question sur un plan d'exécution
    Par pacmann dans le forum SQL
    Réponses: 13
    Dernier message: 04/11/2009, 10h39
  4. Que signifie le petit symbole sur le plan d'exécution ?
    Par cmako dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 01/09/2009, 15h30
  5. vb.net : besoin d'explication sur l'exécution de NtBackup
    Par 1coni dans le forum Windows Forms
    Réponses: 4
    Dernier message: 29/05/2006, 16h55

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