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 :

Mettre le doigt sur un problème de performances


Sujet :

Administration Oracle

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut Mettre le doigt sur un problème de performances
    Bonjour,

    Je travaille depuis quelques mois chez un client.

    Le SGBD est "Oracle Database 10g Release 10.1.0.5.0 - Production".

    Le modèle des données est un modèle éditeur.
    Etant expert sur le logiciel, je maîtrise parfaitement ce modèle des données.

    Parmi les dizaines de clients chez qui je suis intervenu, c'est la première fois que j'ai autant de problèmes de performances.

    Le client, qui se vexe lorsque je lui fait remarquer ces problèmes me rétorques :
    - Que leur base de données est immense
    - Qu'il y a énormément de traitements dessus

    Ça, c'est vrai, il s'agit d'une base volumineuse, et entre les traitements interactifs et les traitements batch, Oracle ne chôme pas une seconde.

    Mais malgré ça, je persiste et signe : le serveur se comporte anormalement.

    Il utilise par exemple les index n'importe comment : lors d'une jointure sur une FK, il va par exemple parfois préférer faire des nested loop sur un full table scan plutôt qu'un index scan...

    Du coup, d'une requête à l'autre (avec pour ainsi dire aucune modification), on passe de quelques millisecondes d'exécution à plusieurs heures.

    Aussi, phénomène que je n'ai pas vu depuis Oracle 7, l'optimiseur est sensible à l'ordre des tables dans la clause FROM :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select *
    from table1 t1
    inner join table2 t2 on t2.id = t1.fk
    inner join table3 t3 on t3.id = t2.fk
    inner join table4 t4 on t4.id = t1.fk
    => table4 est lu à grands couprs de full table scan

    Alors que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select *
    from table1 t1
    inner join table4 t4 on t4.id = t1.fk
    inner join table2 t2 on t2.id = t1.fk
    inner join table3 t3 on t3.id = t2.fk
    => Tout fonctionne à merveille

    Comment expliquez-vous ce phénomène ?

    Un DBA vient une fois par mois regarder la base. J'aimerais pouvoir le coincer avec une étude un peu approfondie en lui disant "ben vérifie ceci, parce que visiblement ça va pas du tout"

    Parmi les pistes que j'ai il y a le recalcul des index : ils sont calculés tous les dimanches soir... Alors que toute la semaine, il y a des gros traitements qui modifient plus de 50% des lignes des plus grosses table... sans recalcul des index !

    Mais ceci n'explique pas le problème d'ordre des table cité ci-dessus...
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select *
    from table1 t1
    inner join table2 t2 on t2.id = t1.fk
    inner join table3 t3 on t3.id = t2.fk
    inner join table4 t4 on t4.id = t1.fk
    => table4 est lu à grands couprs de full table scan

    Alors que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select *
    from table1 t1
    inner join table4 t4 on t4.id = t1.fk
    inner join table2 t2 on t2.id = t1.fk
    inner join table3 t3 on t3.id = t2.fk
    => Tout fonctionne à merveille

    Comment expliquez-vous ce phénomène ?
    C'est peut être lié aux index créés sur les tables concernées.

    Citation Envoyé par StringBuilder Voir le message
    Un DBA vient une fois par mois regarder la base. J'aimerais pouvoir le coincer avec une étude un peu approfondie en lui disant "ben vérifie ceci, parce que visiblement ça va pas du tout"
    Tu peux lui présenter clairement le problème et solliciter son aide pour qu'ensemble vous puissiez trouver une solution aux problèmes de performances. Tu peux essayer de communiquer avec lui (avant qu'il ne passe sur le site) sur les difficultés que tu rencontres. Il peut peut être de guider sur ce qu'il faut faire avant son passage hebdomendaire

    Citation Envoyé par StringBuilder Voir le message
    Parmi les pistes que j'ai il y a le recalcul des index : ils sont calculés tous les dimanches soir... Alors que toute la semaine, il y a des gros traitements qui modifient plus de 50% des lignes des plus grosses table... sans recalcul des index !
    Mais ceci n'explique pas le problème d'ordre des table cité ci-dessus...
    Demande au DBA s'il n'est pas possible de reprogrammer les opérations de maintenances : faire des opérations de maintenance de façon quotidienne au lieu d'une fois par semaine.

    Bref, il faut communiquer avec le DBA de la solution.
    Un bon relationnel avec ce DBA te fera gagner du temps et d’énergie

    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    ils sont calculés tous les dimanches soir... Alors que toute la semaine, il y a des gros traitements qui modifient plus de 50% des lignes des plus grosses table... sans recalcul des index !
    Peut etre qu'un audit type Statspack le lundi en comparaison avec un du samedi pourrait valider / invalider cette piste.
    Cordialement.

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Commencez par tracer et analyser. Dans une de ses interventions Mohamed Houri avait posté deux lien qui vous seront utilies pour avancer.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    493
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 493
    Points : 605
    Points
    605
    Par défaut
    Vérifie que les statistiques sont à jour pour le schéma de ton appli .

    Normalement en 10g, un job automatique GATHER_STATS_JOB tourne quotidiennement pour réaliser cette tâche. Vérifie qu'il est bien activé.

  6. #6
    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
    Lorsque votre DBA viendra la prochaine fois ausculter la base de données montrez lui alors des faits. Comment? En me basant sur ce que vous avez déjà donné comme information, à votre place je ferai ce qui suit (a) si une requête change de temps d'exécution d'un moment à un autre c'est que son plan d'exécution a changé. Il faut alors prendre le plan d'exécution d'avant et d'après. Et demandez-lui d'analyser avec vous les raisons qui ont amené votre plan d'exécution à changer. Il peut y avoir plusieurs raisons; elles s'y trouveront et (b) l'optimisateur (CBO) est plus sensible aux statistiques dont il dispose qu'il ne l'est pour l'ordre des tables dans la clause FROM. C'est pour cette raison qu'il faut générer un explain plan pour ces requêtes que vous citez et voir pourquoi le CBO choisit NESTED LOOP. A ce sujet, en utilisant le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dbms_xplan.display_cursor(null,null, 'ALLSTATS LAST')
    vous allez avoir les estimations(E-Rows) faites par le CBO et les calculs réels (A-Rows) ainsi que le nombre de fois que le CBO a exécuté chaque opération (Starts); une différence entre A-Rows et E-Rows/Starts représente un symptôme de statistiques non à jour. Il faudra alors penser à recalculer les statistiques dans ce cas.

    L’explain plan, grâce à sa partie predicate, montre souvent aussi pourquoi les indexes ne sont pas utilisés ou ne sont pas assez précis à cause d’une double opération, access + filter, au lieu d’un simple access.

    Si par contre, c’est toute l’application qui parfois se met à fonctionner lentement, sans que vous ne sachiez d’où cela provienne, alors le mieux, comme toujours, c’est d’avoir un rapport AWR ou Statspack correspondant à la période où cela n’allait pas très bien et un autre ou cela allait bien.

    Un dernier conseil, sur quel base avez-vous pris la décision de recalculer (rebuild je suppose) les indexes ? Si vous avez fait cela sans vraiment avoir une raison valable au préalable, vous pouvez lire cet article de Jonathan Lewis sur l'altération possible de l’efficacité des indexes au cours de leur vie:

    http://jonathanlewis.wordpress.com/2...-efficiency-3/

    Vous y trouverez certainement plus d’information sur les indexes qui peuvent bénéficier d’une réorganisation. Lorsque je dis réorganisation, cela ne veut pas dire exclusivement un rebuild ; mais cela peut aussi être un coalesce. Surtout pour les indexes qui sont périodiquement vidés sur leur droite et qui continue à être remplis uniquement sur leur gauche comme cela semble être manifestement le cas de votre application.
    Bien Respectueusement
    www.hourim.wordpress.com

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

  7. #7
    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
    Bonjour,

    Aussi, phénomène que je n'ai pas vu depuis Oracle 7, l'optimiseur est sensible à l'ordre des tables dans la clause FROM :
    On pourrait commencer par là. Un explain plan pour les 2 requêtes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    explain plan for  
    SELECT *
    FROM table1 t1
    INNER JOIN table2 t2 ON t2.id = t1.fk
    INNER JOIN table3 t3 ON t3.id = t2.fk
    INNER JOIN table4 t4 ON t4.id = t1.fk
    /
    select * from table(dbms_xplan.display);
    Que le plan change suivant l'ordre, c'est pas normal. Mais qu'il choisisse un full scan où est le problème ?

    Cordialement,
    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

Discussions similaires

  1. [11gR2] Votre avis au feeling sur possible problème de performance ?
    Par ctobini dans le forum Administration
    Réponses: 5
    Dernier message: 08/08/2014, 18h04
  2. Problèmes de performances sur une base oracle 10g
    Par ORAMEL dans le forum Oracle
    Réponses: 3
    Dernier message: 11/09/2007, 09h11
  3. Réponses: 3
    Dernier message: 20/04/2007, 12h19
  4. Problème pour mettre un TChart sur QReport pour l'impression
    Par ghan77 dans le forum Composants VCL
    Réponses: 14
    Dernier message: 25/01/2006, 13h28
  5. Problème de performance sur une "grosse" BD
    Par frechy dans le forum Installation
    Réponses: 9
    Dernier message: 19/09/2005, 16h52

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