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 :

Buffer Gets important


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    Points : 21
    Points
    21
    Par défaut Buffer Gets important
    Bonjour,

    comment puis-je analyser le comportement de cette requête qui a un comportement aléatoire en terme de durée et de buffer gets ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  ...
    FROM  zcptesl0
    WHERE
      cptesleta = :etab
      AND cpteslpla = :plan
      AND cpteslref = rpad(:refer, 26, ' ')
      AND cpteslobl = rpad(:coobl, 10, ' ')
      AND key_mbr = 'ZCPTESL0'
      AND cpteslage = :agence
      AND cptesldev = :devise
    ORDER BY
      cptesleta, cpteslpla, cpteslobl, cptesldev, cpteslage, cpteslcom
    Nom : EDIT_HC.PNG
Affichages : 209
Taille : 30,8 Ko

    Nom : EDIT2_HC.PNG
Affichages : 205
Taille : 57,4 Ko

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Bonjour,

    Pas super exploitable les infos. C'est quoi le plan d'exécution de la requête?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    le plan d'exécution est le suivant

    Nom : Capture.PNG
Affichages : 188
Taille : 27,4 Ko

  4. #4
    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
    Ton plan d'exécution est peu utilisable, je ne sais pas comment tu l'as généré mais je te conseille de lire ceci :
    http://dbaoraclesql.canalblog.com/ar.../39496756.html
    http://dbaoraclesql.canalblog.com/ar.../39509234.html
    http://dbaoraclesql.canalblog.com/ar.../39513680.html
    http://dbaoraclesql.canalblog.com/ar.../39539467.html


    Pourquoi avoir mis optimizer_index_cost_adj à 10? Si ce paramètre vaut moins de 100, tu veux favoriser les index; pourquoi ne pas laisser l'optimiseur décider du plan?
    Le e-rows est à 1 : il nous faut le plan des deux exécutions, celle du 08/08 à 10h00 ou 11h00 posant pb et celle du 09/08 où c'est OK.
    On voit que le nb de Buffer Gets explose le 08/08 mais pas pour 12h00 et 13h00 : très curieux car le Elapsed Time, lui, ne change pas...

    Sais-tu si la volumétrie de ta table a fortement changé entre ces deux journées?
    Est-ce que les paramètres influençant l'optimiseur ont changé entre le 08/08 et le 09/08?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    concernant optimizer_index_cost_adj à 10, je ne sais pas pourquoi il a été positionné avec cette valeur.

    Je vais récupérer les plans d'exécutions avec la via DBMS_XPLAN.DISPLAY_CURSOR.

    La table contient deux valeurs distinctes pour la colonne cptesleta. Cette table est vidée puis remplie lors de chaque exécution. Les stats ont été calculées table pleine mais avec la valeur cptesleta = 2 uniquement.

    Dans les binds variables du plan, il indique 1 comme valeur de la colonne cptesleta , donc à priori la première requête exécutée est la requête avec la valorisation de cptesleta à 1 (aucunes données dans la table correspondante au moment de l'exécution de la requête)

    Le pb est sur la requête avec cptesleta = 2. Peut-être qu'un autre plan serait plus optimale mais n'utilise t'il pas le plan calculé lors de la première exécution de la requête ? Ce plan est peut-être optimale pour cptesleta = 1 mais pas pour cptesleta = 2 ?

  6. #6
    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
    Citation Envoyé par grouhan Voir le message
    concernant optimizer_index_cost_adj à 10, je ne sais pas pourquoi il a été positionné avec cette valeur.
    Mets ce paramètre à 100, c'est la valeur par défaut et voit si c'est mieux.


    Citation Envoyé par grouhan Voir le message
    La table contient deux valeurs distinctes pour la colonne cptesleta. Cette table est vidée puis remplie lors de chaque exécution. Les stats ont été calculées table pleine mais avec la valeur cptesleta = 2 uniquement.
    Le pb est sur la requête avec cptesleta = 2. Peut-être qu'un autre plan serait plus optimale mais n'utilise t'il pas le plan calculé lors de la première exécution de la requête ? Ce plan est peut-être optimale pour cptesleta = 1 mais pas pour cptesleta = 2 ?
    Tu as TOUT compris, pour cptesleta = 1, Oracle génère un plan d'exécution Plan1, et pour cptesleta = 2, Oracle peut (ou non, selon l'histogramme sur cptesleta), réutiliser le même plan Plan1 ou bien en générer un autre, de nom Plan2, plus performant.
    Il y a un histogramme sur la colonne cptesleta de cette table?

    Ce qui est important, c'est quand tu dis "Cette table est vidée puis remplie lors de chaque exécution." : c'est normal que cette table soit vidée? Cela sert à quoi?
    Je te conseille TRES TRES fortement, au cas où la volumétrie ou la sélectivité sur toutes les colonnes de ta clause WHERE (notamment cptesleta) change fortement.
    Donc après avoir vidé et remplit ta table, appelle dbms_stats.gather_table_stats avec, si possible (si cela ne prend pas trop de temps), le paramètre estimate_percent à 90% ou 100%.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Oui il y a bien un histogramme sur la colonne cptesleta de type FREQUENCE.

    C'est une table de travail qui est alimentée avec les données du jour qui sont exploitée et la table est ensuite vidée.

    Les stats ont été figées table pleine sur un jeu de données représentatif de la cible.

    Oracle n'est-il pas censé utilisé un plan d'exécution différent si nécessaire via la fonctionnalité Active Cursor Sharing ?

  8. #8
    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
    Citation Envoyé par grouhan Voir le message
    C'est une table de travail qui est alimentée avec les données du jour qui sont exploitée et la table est ensuite vidée.
    Les stats ont été figées table pleine sur un jeu de données représentatif de la cible.
    C'est une bonne façon de traiter les tables très volatiles. Mais je te laisse vérifier ton affirmation "un jeu de données représentatif".

    Citation Envoyé par grouhan Voir le message
    Oracle n'est-il pas censé utilisé un plan d'exécution différent si nécessaire via la fonctionnalité Active Cursor Sharing ?
    Oui, mais, comme tu le dis, uniquement "si nécessaire". Si le CBO estime, d'après ses entrées (stats, paramètres, contraintes d'intégrité...), que le plan d'exécution en mémoire est OK, il n'a pas besoin d'en calculer un nouveau.

    Et quid du paramètre optimizer_index_cost_adj ?
    Tu devrais essayer de le mettre à 100.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    OK, merci,

    Pas pu avoir le résultat avec le paramètre optimizer_index_cost_adj = 100

    Je vous tiens informé

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Bonjour,

    Citation Envoyé par grouhan Voir le message
    Oracle n'est-il pas censé utilisé un plan d'exécution différent si nécessaire via la fonctionnalité Active Cursor Sharing ?
    La notion d' Active Cursor Sharing n'existe pas. Par contre, il existe un ''feature'' appelé Adaptive(Extended) Cursor Sharing : ACS

    Si vous voulez comprendre ce "feature" je vous invite à lire ce que j'ai écrit à ce sujet (beaucoup d'articles)

    https://hourim.wordpress.com/?s=Adaptive+Cursor+sharing

    Pour votre cas, il y a un histogram du type FREQUENCY sur votre requête: pour que cette requête soit candidate à ACS il faut d'abord que votre cursor soit bind sensitive

    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
    col object_status format a20
    col end_of_fetch_count format 999
    SELECT
         p.sql_id
    	,p.child_number
        --,p.plan_hash_value
    	,p.is_bind_sensitive bsens
    	,p.is_bind_aware baware 
        --,p.first_load_time	
    	--,p.last_load_time
        ,p.executions
    	,p.end_of_fetch_count end_fetch
    	,p.invalidations
    	,p.object_status
     FROM   
        gv$sql p
    where
        p.sql_id = '&sql_id'
    and    
      p.is_shareable ='Y';
    Je vous repondrai pourquoi votre requête ne change pas de plan automatiquement lorsque j'aurai le résultat de la requête précédente

    Bien à vous
    Mohamed Houri
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    l'ajout d'un index composée sur l'ensemble des critères de la clause where a permis de revenir à une situation plus stable.

Discussions similaires

  1. [12c] Delete snapshots AWR : 30 000 physical reads et 8 000 000 de buffer gets
    Par Ikebukuro dans le forum Administration
    Réponses: 16
    Dernier message: 28/03/2019, 16h54
  2. Lecture de buffer important sur la fonction Recv
    Par Fooshi dans le forum Réseau
    Réponses: 1
    Dernier message: 31/07/2010, 22h20
  3. [Migration] [XI] Erreur C++ Buffer overrun à la génération de l'archive BIAR dans l'Import Wizard
    Par rfr14 dans le forum Administration-Migration
    Réponses: 1
    Dernier message: 20/02/2009, 17h05
  4. tp check buffer for already imported requests
    Par Dlfine dans le forum SAP
    Réponses: 0
    Dernier message: 29/09/2008, 13h26
  5. [XSLT] fichier.xml?tag=import récupérer avec get
    Par LeXo dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/10/2007, 14h28

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