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

PL/SQL Oracle Discussion :

Procédure stockée : comportement instable


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut Procédure stockée : comportement instable
    Bonjour,

    Oracle version 9.2.0.4.0.

    J'ai une procédure stockée à priori toute bête qui :
    - DELETE d'une table Z les enreg. d'une période donnée.
    - recharge cette même période dans la table Z en faisant un INSERT...SELECT à partir de 3 tables A, B et C.
    - en fin de procédure, met à jour les stats sur la table Z avec le package DBMS_STATS.GATHER_TABLE_STATS.

    Ma table Z est vide au départ.
    Je lance la procédure une première fois, le temps de réponse est correct (8 secondes) : 488 lignes sont insérées dans la table Z.
    Si je lance la procédure une deuxième fois, le temps de réponse est de 10 minutes ! Le pas à pas montre que c'est le INSERT...SELECT qui est long.
    A ma connaissance, les statistiques peuvent détériorer l'accès aux tables en SELECT dans certains cas, mais peuvent-elles également le détériorer en INSERT ?

    Si je supprime les stats avec DBMS_STATS.DELETE_TABLE_STATS, le temps d'exécution de la procédure reste mauvais.
    Si je droppe et recrée la table, idem.
    Si je quitte ma session et je me reconnecte, idem.
    Par contre, l'exécution manuelle des 2 requêtes de la procédure stockée (DELETE puis INSERT) est très rapide.

    La seule solution que j'ai trouvé pour que la procédure stockée s'exécute à nouveau dans un temps normal, c'est de couper puis redémarrer la base.

    Après avoir redémarrer la base, je recompile ma procédure en commentant l'appel au package DBMS_STATS.
    Je peux lancer ma procédure 2 fois de suite avec des performances correctes (8 s).
    Si je fais un TRUNCATE de la table, je retombe dans le cas de figure décrit précédemment avec un temps d'exécution de la procédure stockée de 10 minutes.
    Là aussi, ce n'est qu'en redémarrant la base que ça redevient normal...

    Je pensais dans un premier temps que ça venait des statistiques, mais je m'aperçois que même en les inhibant, un TRUNCATE fout le bazar. Je me demande si ce n'est pas lié à l'exécution d'un ordre DDL, ou sinon à un éventuel verrou laissé sur la table (ce qui ne colle pas non plus avec le cas où le DROP de la table ne récupère pas la situation), ou à un paramètre de la base, ou encore à autre chose...

    Avez-vous des idées ?

    Merci beaucoup.

  2. #2
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Une première piste serait de comparer les plans d'exécutions avant et après les statisques, cela te permettra déjà de comprendre pourquoi ta requête est si longue après le calcul des stats

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Effectivement, il y a une différence : il me fait un HASH JOIN entre 2 instances de ma table C lors de la première exécution, puis un NESTED LOOPS à cet endroit lors de la deuxième exécution.

    Mais en quoi la mise à jour des statistiques ou un TRUNCATE sur la table destination Z peut modifier le plan d'accès à l'une des tables sources ?

  4. #4
    Membre expérimenté Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    Mais en quoi la mise à jour des statistiques ou un TRUNCATE sur la table destination Z peut modifier le plan d'accès à l'une des tables sources ?
    Le truncate met le num_rows à zéro dans les stats. Et les stats, ca sert justement à modifier le plan d'accès pour avoir celui le plus optimum possible.

    Tu dois avoir un souci dans ta gestion des stats alors

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Oui, mais je mets à jour les stats pour la table destination, et c'est l'accès à l'une des tables source qui est modifié...

  6. #6
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    Oui, mais je mets à jour les stats pour la table destination, et c'est l'accès à l'une des tables source qui est modifié...
    Ca c'est effectivement très étrange... Tu es bien sur que tu te limites à ta table de destination pour la collecte des stats? juste au cas où hein

    Tu peux nous mettre les plans exacts s'ils ne sont pas trop longs?

Discussions similaires

  1. Comportement étrange procédure stockée
    Par StitchP dans le forum Développement
    Réponses: 12
    Dernier message: 05/07/2012, 10h00
  2. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  3. Procédure stockée : comportement instable
    Par dgi77 dans le forum SQL
    Réponses: 11
    Dernier message: 25/10/2007, 18h30
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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