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

Administration Oracle Discussion :

Question Time Plan [12c]


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 731
    Par défaut Question Time Plan
    Bonjour,

    Je cherche à comprendre le rapport entre ELAPSED_TIME remonté par cette requête et Time remonté dans le Plan ? et entre BUFFER_GETS (Requête) et consistent gets 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SQL> select to_char(LAST_ACTIVE_TIME, 'DD/MM/YYYY HH24:MI:SS'), EXECUTIONS, ROWS_PROCESSED, CPU_TIME, ELAPSED_TIME, BUFFER_GETS from V$SQLSTATS where SQL_ID = 'gmakm8zzgh3ta';
    TO_CHAR(LAST_ACTIVE EXECUTIONS ROWS_PROCESSED   CPU_TIME ELAPSED_TIME BUFFER_GETS
    ------------------- ---------- -------------- ---------- ------------ -----------
    25/03/2021 17:20:49          1          20000      78125       129684        1778
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 3582063246
    ----------------------------------------------------------------------------
    | Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |        | 20000 |  2363K|   102   (1)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| ZZTEST | 20000 |  2363K|   102   (1)| 00:00:01 |
    ----------------------------------------------------------------------------
    Statistiques
    ----------------------------------------------------------
              1  recursive calls
              4  db block gets
           1670  consistent gets
              0  physical reads
              0  redo size
        1216454  bytes sent via SQL*Net to client
          15271  bytes received via SQL*Net from client
           1335  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
          20000  rows processed
    Merci.

    A+

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Tiens, tu crées tes tables avec le même nom que moi : ZZTEST

    Attention, V$SQLSTATS est une vue agrégée, pas détaillée donc ici tu as de la chance, EXECUTIONS vaut 1 mais si ça valait 10, tu ne pourrais pas diviser chaque donnée par 10 car tu aurais uniquement une moyenne.
    Dans le plan il manque la colonne "consistent gets".
    La colonne ELAPSED_TIME de V$SQLSTATS est en micro secondes soit ici 0,1 seconde. Comme dans ton plan d'exécution on a pas les 10ème de secondes, Oracle arrondit à 1 seconde.

    Comment as-tu obtenu ton plan d'exécution? C'est quoi l'ordre SELECT exécuté?

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 731
    Par défaut
    Bonjour,

    Je me suis servi, j'ai utilisé ta table (créée à base de DBA_OBJECTS) pour faire mon p'tit TP perso Merci de ton article bien fait

    J'ai fait un select * puis mon plan généré avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set autotrace on explain

    J'ai refait un test avec :

    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
    EXPLAIN PLAN FOR select * from zztest;
    Plan hash value: 3582063246
     
    ----------------------------------------------------------------------------
    | Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |        | 20000 |  2363K|   102   (1)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| ZZTEST | 20000 |  2363K|   102   (1)| 00:00:01 |
    ----------------------------------------------------------------------------
     
    8 lignes sÚlectionnÚes.
     
     
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 2137789089
     
    ---------------------------------------------------------------------------------------------
    | Id  | Operation                         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                  |         |  8168 | 16336 |    29   (0)| 00:00:01 |
    |   1 |  COLLECTION ITERATOR PICKLER FETCH| DISPLAY |  8168 | 16336 |    29   (0)| 00:00:01 |
    ---------------------------------------------------------------------------------------------
     
     
    Statistiques
    ----------------------------------------------------------
             14  recursive calls
              0  db block gets
             12  consistent gets
              0  physical reads
            120  redo size
           1131  bytes sent via SQL*Net to client
            608  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              8  rows processed
     
    SQL>
    Il y a 2 plan: Plan hash value: 3582063246 et Plan hash value: 2137789089 ?

    MERCI encore.

    A+

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Si tu as fais exactement le même SELECT, je ne vois pas pourquoi il y aurait deux plan hash value différents; en plus il n'y a pas de bind variables dans le SELECT donc c'est un pb en moins.

    Tu as bien fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set autotrace on explain
    avant de lancer le SELECT?

    Et c'est quoi le plan d'exécution avec le hash value de 2137789089?

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 731
    Par défaut
    Re et Merci.

    Je suis un peu perdu ! j'ai ça pour ce code plan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> select distinct(sql_id) from v$sql_plan where plan_hash_value='2137789089';
     
    SQL_ID
    -------------
    bsvpwnht1m9bm
    3s1hh8cvfan6w
    ff5spha9pjuyu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> select sql_text from v$sql
      2  where sql_id ='bsvpwnht1m9bm';
     
    SQL_TEXT
    --------------------------------------------------------------------------------------------------------------------------------------------
    SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', :1))
     
    SQL> select sql_text from v$sql
      2  where sql_id ='ff5spha9pjuyu';
     
    SQL_TEXT
    ----------------------------------------------------------------------------------------------------------------------------------------------
    select * from table(dbms_xplan.display)

    Je n'ai pas compris le fait que sql_id/hash_value peuvent avoir plusieurs PLAN_HASH_VALUE !

    MERCI

    A+

  6. #6
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Un SQL_ID peut avoir plusieurs plan hash value et chacun est le meilleur, selon le contexte.
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ZZTEST WHERE NAME = :NOM;
    Si :NOM vaut "DUPONT" et que ce nom représente 90% de la table ZZTEST, tu auras un plan d'exécution avec un FULL TABLE SCAN.
    Si :NOM vaut "ZARAMO" et que ce nom représente 1% de la table ZZTEST, tu auras un plan d'exécution avec utilisation d'un index.

    Un plan d'exécution peut être associé à plusieurs SQL_ID.
    Par exemple si la majorité des DUPONT habite PARIS, les SELECTs suivants donnent deux SQL_ID différents mais le même plan d'exécution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM ZZTEST WHERE NOM = 'DUPONT';
    SELECT * FROM ZZTEST WHERE NOM = 'DUPONT' AND VILLE = 'PARIS';
    Quand tu as généré le plan ci-dessous, ce n'est pas lié à un SELECT applicatif. C'est certainement parce que tu as fais un AUTOTRACE après ton SELECT car les SELECTs avec les id bsvpwnht1m9bm, 3s1hh8cvfan6w et ff5spha9pjuyu sont des SELECTs internes à Oracle, liés à ta demande d'afficher les plans.
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 2137789089
     
    ---------------------------------------------------------------------------------------------
    | Id  | Operation                         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                  |         |  8168 | 16336 |    29   (0)| 00:00:01 |
    |   1 |  COLLECTION ITERATOR PICKLER FETCH| DISPLAY |  8168 | 16336 |    29   (0)| 00:00:01 |
    ---------------------------------------------------------------------------------------------

    Donc rappel : l'ordre est important.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXPLAIN PLAN FOR SELECT***
    puis utiliser dbms_xplan.display (pas dbms_xplan.display_cursor).
    Ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET AUTOTRACE ON
    SELECT***
    puis utiliser dbms_xplan.display (pas dbms_xplan.display_cursor).

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

Discussions similaires

  1. [AC-2010] Petite Question : Recherche Planning pour Entreprise
    Par seraphins dans le forum Access
    Réponses: 1
    Dernier message: 11/01/2016, 12h14
  2. Joda Time (générale + question sur les périodes)
    Par aperrin dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 24/10/2007, 14h56
  3. Réponses: 6
    Dernier message: 17/04/2007, 11h34
  4. [VB6]Question de Time ou Date
    Par riesseg dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 10/05/2006, 15h33
  5. Réponses: 13
    Dernier message: 23/06/2005, 10h56

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