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 :

Colonnes BUFFERS et READS du plan d'exécution


Sujet :

Administration Oracle

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    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 : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut Colonnes BUFFERS et READS du plan d'exécution
    Amis DBA bonjour,

    Je sèche depuis ce matin sur la signification des colonnes BUFFERS et READS dans un plan d'exécution.
    La doc Oracle ne mentionne rien, pouvez-vous me dire à quoi cela correspond précisément? Je précise "précisément" car la colonne BUFFERS augmente parfois de façon bizarre, surtout si je lis des données via un ou plusieurs "user rowid".

    Test 1 : un rowid
    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
    SQL> select /*+ gather_plan_statistics */ * from zztest where rowid = 'AAAUKFAAMAAACRDAAA';
    ...
     
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));
    PLAN_TABLE_OUTPUT
    -------------------------------------------------------------------------
    SQL_ID	1kwbmj9ubvzma, child number 0
    -------------------------------------
    select /*+ gather_plan_statistics */ * from zztest where rowid =
    'AAAUKFAAMAAACRDAAA'
     
    Plan hash value: 833697196
     
    -----------------------------------------------------------------------------------------------
    | Id  | Operation		   | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    -----------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	   |	    |	   1 |	      |      1 |00:00:00.01 |	    1 |
    |   1 |  TABLE ACCESS BY USER ROWID| ZZTEST |	   1 |	    1 |      1 |00:00:00.01 |	    1 |
    -----------------------------------------------------------------------------------------------
    Test 2 : dix rowid. Deux pour la colonne BUFFERS alors que les ROWID pointent vers le même bloc Oracle selon DBMS_ROWID.
    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
    SQL> select /*+ gather_plan_statistics */ * from zztest where rowid IN ('AAAUKFAAMAAACRDAAA','AAAUKFAAMAAACRDAAB','AAAUKFAAMAAACRDAAC','AAAUKFAAMAAACRDAAD','AAAUKFAAMAAACRDAAE','AAAUKFAAMAAACRDAAF','AAAUKFAAMAAACRDAAG','AAAUKFAAMAAACRDAAH','AAAUKFAAMAAACRDAAI','AAAUKFAAMAAACRDAAJ');
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));
     
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	f963u8zq3nbbh, child number 1
    -------------------------------------
    select /*+ gather_plan_statistics */ * from zztest where rowid IN
    ('AAAUKFAAMAAACRDAAA','AAAUKFAAMAAACRDAAB','AAAUKFAAMAAACRDAAC','AAAUKFA
    AMAAACRDAAD','AAAUKFAAMAAACRDAAE','AAAUKFAAMAAACRDAAF','AAAUKFAAMAAACRDA
    AG','AAAUKFAAMAAACRDAAH','AAAUKFAAMAAACRDAAI','AAAUKFAAMAAACRDAAJ')
     
    Plan hash value: 904234787
     
    ------------------------------------------------------------------------------------------------
    | Id  | Operation		    | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    ------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	    |	     |	    1 |        |     10 |00:00:00.01 |	     2 |
    |   1 |  INLIST ITERATOR	    |	     |	    1 |        |     10 |00:00:00.01 |	     2 |
    |   2 |   TABLE ACCESS BY USER ROWID| ZZTEST |	   10 |      1 |     10 |00:00:00.01 |	     2 |
    ------------------------------------------------------------------------------------------------
     
    Note
    -----
       - statistics feedback used for this statement

    Par avance merci pour vos retours
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    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 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Salut,

    BUFFERS, c'est bien comme tu le penses les lectures de blocks, qui s'appelle ailleurs logical reads, buffer_gets, consistent reads,...

    Si tu lis plusieurs lignes d'un même bloc, c'est un seul buffer get du moment que c'est dans le même user call (fetch). Mais la session ne peut pas garder le bloc épinglé (pinned) entre 2 appels clients et du coup c'est recompté comme un buffer get à chaque fetch même si on revient sur le même bloc.
    Mon hypothèse c'est que tu lances ça depuis sqlplus avec les valeurs par défaut pour ROWPREFETCHSIZE (=1) et ARRAYSIZE (=15) et donc le premier fetch lit 1 ligne -> 1 buffer gets et le fetch suivant lit les 9 lignes suivante, toujours dans le même bloc -> 1 buffer get. C'est le même bloc mais visité 2 fois.
    Tu peux jouer avec ces paramètres pour voir la différence.
    Tu peux aussi rajouter un ORDER BY -> tout sera lu en 1 fois -> 1 buffer get seulement. Le fetch iront lire dans la workarea en mémoire -> pas plus de buffer gets.

    On doit voir ça aussi dans le dump brut de sql_trace vu que chaque ligne FETCH met son nombre de bloc (cr=)

    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    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 : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Merci beaucoup Franck,

    QU'est-ce que je ferais sans toi
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/11/2017, 15h03
  2. Plan d'exécution pas logique
    Par pat29 dans le forum Administration
    Réponses: 6
    Dernier message: 07/03/2008, 14h37
  3. Réponses: 12
    Dernier message: 22/06/2006, 10h26
  4. Plan d' exécution
    Par rod59 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 15/06/2006, 21h50
  5. Comparer des plan d'exécution
    Par sygale dans le forum Oracle
    Réponses: 7
    Dernier message: 06/04/2006, 17h58

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