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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    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 : 315
Taille : 30,8 Ko

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

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 169
    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 169
    Par défaut
    Bonjour,

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

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

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

    le plan d'exécution est le suivant

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

  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
    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?

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 42
    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 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
    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%.

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