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 SQL Server Discussion :

Procédure stockée WITH OPTION RECOMPILE perte de performance


Sujet :

Administration SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut Procédure stockée WITH OPTION RECOMPILE perte de performance
    Bonjour à tous,

    Je suis sur une BDD SQL Server Managé Azure et depuis hier j'ai des problèmes de performance avec certaines procédures stockées.
    Avant 15h00 les proc. stoc. prenaient chacune 4 à 5s et d'un seul coup les délais sont passés à 6mn.

    Après plusieurs recherches, j'écarte plusieurs hypothèses:
    > les index sont bien fragmentés
    > les stats ont été recalculés
    > pas de "corruption de donnée" qui alourdirait les requêtes

    Par contre, très surprenant, en supprimant l'option RECOMPILE dans les procédures stockées je reviens à des temps d'exécution plus acceptables en moyenne 20s.
    Mais j'ai malgré tout une perte significative de performance.

    Pour le moment, j'ai supprimé "RECOMPILE" parce que si je le laissais j'avais des Timeouts sur la BDD.

    Pour info, les procédures stockées utilisent des bloc WITH, et font de l'INSERT. Sur les IO je ne vois rien de spécial.

    Est ce que quelqu'un aurait une piste pour comprendre ce qui se passe ??
    Est il possible que tempdb soit full ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    RECOMPILE impose de recréer un plan de requête à chaque fois que la requête est lancée. C'est effectivement une perte de temps dans une très grande majorité de cas. De plus, il arrive souvent que l'option RECOMPILE oblige un recalcul des statistiques. Pour peu que la requête soit très complexe et les tables très grande, ce mécanisme peut prendre beaucoup de temps. Il faudrait auditer les requêtes passées et voir si le processus STATMAN est déclenché...

    Vous pouvez aussi regarder les attentes avec sys.sys.dm_exec_session_wait_stats et notamment si vous avez des attentes de type WAIT_ON_SYNC_STATISTICS_REFRESH

    A +

  3. #3
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut
    Pour autant j'ai lu beaucoup d'article que OPTION RECOMPILE évitait le sniffing de paramètre et donc de recréer des plans inutilement et que c'est pour cette raison que les procédures avec cette option sont plus rapides.
    Ou bien j'ai mal compris !

    Voici quelques stats' (en pièce jointe)que j'ai réussi à trouver avec quelques requêtes préco par Microsoft.
    Mais je ne vois rien de choquant de mon côté.

    stat_dev_com.xlsx

  4. #4
    Membre actif
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Points : 223
    Points
    223
    Par défaut
    Alors nuance quand même voici le code dans mes headers de procédure TSQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE PROCEDURE pc_test @dtDay DATETIME
       WITH
       RECOMPILE
       AS
    Sur cette option j'ai rien touché pour le moment ...

    Par contre dans les procédures stockées, j'ai un SELECT assez complexe ou je fini par C'est celui ci que j'ai mis en commentaire, et depuis plus de timeout, mais toujours pas les mêmes performances qu'auparavant.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Il faudrait le plan de requête, la requête et la structure des tables et index

    pour information, les plans évoluent en fonction de différents paramètres tels que la volumétrie et la distribution des données (cardinalité). Traiter 2000000 clients à Paris ne générera pas le même plan que traiter le seul client de Trifouilly-lès-Argonzettes.

    A +

  6. #6
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    Vous avez aussi la solution Query Store, qui permet de garder le bon plan d'exécution et ainsi d'eviter le parametre sniffing
    Vous pouvez aussi OPTMIZE for @valeurdonné qui peut vous dépanner quand vous utilisez une variable bien précise :




    Sinon bcp moins connu vous pouvez utiliser les sous procedures stockées, j'en parle aussi dans cette vidéo



Discussions similaires

  1. Réponses: 0
    Dernier message: 09/04/2014, 11h06
  2. Performances calamiteuses d'une procédure stockée
    Par mirumoto dans le forum PL/SQL
    Réponses: 35
    Dernier message: 08/09/2010, 08h55
  3. tester IF EXIST dans procédure stockée clause WITH
    Par brasco06 dans le forum Développement
    Réponses: 8
    Dernier message: 27/08/2009, 19h11
  4. [2005] Performances de XML dans une procédure stockée
    Par franculo_caoulene dans le forum Développement
    Réponses: 3
    Dernier message: 17/04/2009, 11h40
  5. [VB.NET]Performance exécution procédure stockée
    Par Franck2mars dans le forum Windows Forms
    Réponses: 3
    Dernier message: 29/05/2006, 17h11

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