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

Développement SQL Server Discussion :

Comportement étrange procédure stockée


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mars 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 130
    Points : 93
    Points
    93
    Par défaut Comportement étrange procédure stockée
    Bonjour à toutes et à tous,

    je rencontre un phénomène quelque peu étrange que je ne m'explique pas...
    Voilà mon problème :

    Je dispose de 2 bases de données dont le contenu est identique, dans le même environnement (seul leur nom change car elles ne vont pas être utilisées de la même façon, mais ce n'est pas le sujet).
    Je lance une procédure stockée (récupération de données selon différents critères, sur plusieurs vues), la même, sur chacune des 2 bases.

    Le temps d'exécution pour chaque BDD est complètement incohérent : quelques secondes pour la première, plusieurs minutes pour la seconde

    L'ennui c'est que cette procédure est utilisée en production, et que selon le volume de données demandées (filtre sur une plage temporelle), son utilisation habituelle est plutôt de l'ordre de la 1/2h...
    Je pensais que cela venait de l'environnement de production, mais vu mes résultats en développement je commence à avoir de sérieux doutes

    Quelqu'un aurait-il une idée ? Des propriétés à regarder du côté des bdd ?

    Merci par avance !

  2. #2
    Membre averti Avatar de pulsdrum
    Homme Profil pro
    MVP SQL Server - Consultant en Business Intelligence - MCITP, MCTS et MCSA SQL Server 2008/2012
    Inscrit en
    Juillet 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : MVP SQL Server - Consultant en Business Intelligence - MCITP, MCTS et MCSA SQL Server 2008/2012
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2009
    Messages : 61
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    Plusieurs pistes :
    - Regarde dans les propriétés de tes bases de données dans quels fichiers / disques dures elles sont stockées.
    - Regarde les index utilisés par la procédure via l’affichage du plan d'exécution graphique dans SQL Server Management Studio.
    - Regarde si t’es tables/vues utilisées par la procédure son partitionnées.

    D’autre part, sache que tu peux optimiser ta procédure pour des paramètres spécifique (OPTION OPTIMIZE FOR).

    Tu peux aussi utiliser l’option « WITH RECOMPILE » pour dire à SQL Server de générer un nouveau plan d’exécution à chaque appel de la procédure.

    Enfin tu peux utiliser "SQL Server Database Engine Tuning Advisor" pour optimiser ta procédure. Il te proposera de créer des index, de partitionner t’es tables… S’il pense que c’est utile

    ++

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Tu peux aussi utiliser l’option « WITH RECOMPILE » pour dire à SQL Server de générer un nouveau plan d’exécution à chaque appel de la procédure.
    Si la procédure stockée est utilisée en production et appelée très fréquemment, cela va consommer beaucoup de CPU.

    En piste 1 on peut tout simplement vérifier si les statistiques sont maintenues sur les deux serveurs ...

    @++

  4. #4
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mars 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 130
    Points : 93
    Points
    93
    Par défaut
    Bonjour et merci pour vos réponses

    @pulsdrum :
    les fichiers de bdd et les logs pour les 2 bases sont stockées au même endroit.

    @elsuket :
    de quelles statistiques parles-tu ?

    La procédure stockée n'est a priori pas utilisée souvent, quelques fois par jour.
    Je vais regarder du côté de "SQL Server Database Engine Tuning Advisor" aussi...
    mais j'ai des doutes que ce ne soit qu'un histoire d'optimisation si ?
    Dans le sens où avec les mêmes données qu'en production je passe de 5 minutes à 1/2h...

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Les statistiques, ça change vraiment tout.
    J'aime bien l'exemple de l'annuaire, ça parle aux gens. Alors imaginez la requête suivante : trouvez toutes les personnes s'appelant "Ichido", pour toutes les villes.

    Mon annuaire comporte réellement 10 villes, et 10000 noms (la plupart différents, peut-être 9000 valeurs différentes) par ville.

    Statistiques à jour : il y a 10 villes dans l'annuaire, la dispersion sur les noms est très forte, je vais aller regarder chaque ville et pour chacune, je vais essayer de trouver le nom. Je vais faire 10 lectures à petit scan d'index, et concaténer le tout.
    Statistiques pas du à jour : j'ai 10000 villes, et seulement 10 noms par ville. Il semble nettement plus raisonnable de tout lire d'un coup, et filtrer directement sur le nom. Je fais un "full table scan" et je me lis les 100 000 enregistrements.

    On imagine la différence de temps de traitement

  6. #6
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mars 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 130
    Points : 93
    Points
    93
    Par défaut
    En fait j'avais rapatrié une sauvegarde la bdd de production pour la tester (histoire d'avoir les mêmes volumes). Je dois donc avoir les mêmes statistiques dans les 2 environnements non ? Tout comme le même taux de fragmentation des index a priori ?

    A noter que j'utilise la base en source pour Reporting Services. Je sais que je ne suis pas sur le forum Microsoft BI, mais pensez-vous que ça puisse jouer d'une façon ou d'une autre sur le temps de réponse ?
    Je ne vois que ça comme différence entre mes 2 bases de test en fait...

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Je dois donc avoir les mêmes statistiques dans les 2 environnements non ? Tout comme le même taux de fragmentation des index a priori ?
    C'est effectivement exact.

    Est-ce que les bases de données sont sur le même serveur ?

    @++

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Points : 78
    Points
    78
    Par défaut Les mêmes ne sont pas pareils...
    Citation Envoyé par StitchP Voir le message
    Je dois donc avoir les mêmes statistiques dans les 2 environnements non ? Tout comme le même taux de fragmentation des index a priori ?
    Bonjour StichP,

    Pourquoi assumer et ne pas vérifier? Est-ce vraiment la même PS? Car il faut bien admettre, qu'à priori, ce problème ne tient pas: la même procédure appliquée à 2 BD identiques a un comportement erratique...

    Il me semble évident qu'il manque un élément crucial:
    1 - Bin, les 2 PS sont presque identiques sauf que...
    2 - Ah bin, j'ai oublié de dire que les BD sont sur 2 serveurs différents...
    3 - Misère, j'ai oublié de dire que les comptes-utilisateurs sont différents...

    Est-ce que LA PS tourne dans le même temps dans le studio? Il n'est absolument pas nécessaire de 'recompiler': SQL fait un très bon travail...

    Note que 'reporting services' est un engin très capricieux: les modifications du SQL doit être fait dans le studio sinon il semble (je me suis salement battu avec la chose) que l'optimisation n'ait pas lieu.

    Bonne chance,
    JLCantara.

  9. #9
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mars 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 130
    Points : 93
    Points
    93
    Par défaut
    Bonjour JLCantara et merci de me prendre pour une truffe

    Car il faut bien admettre, qu'à priori, ce problème ne tient pas: la même procédure appliquée à 2 BD identiques a un comportement erratique...
    Je suis bien d'accord, ça n'a aucun sens. C'est bien pour avoir des pistes sur d'éventuelles différences auxquelles je n'aurai pas pensé que je pose la question sur un forum...

    Pour répondre à tes questions :
    - oui mes 2 bdd de TEST sont bien sur le même serveur,
    - j'utilise le même compte utilisateur pour tester ma procédure stockée
    - les 2 PS sont bien identiques
    - j'ai regardé les statistiques et je suis dans le même état en production qu'en développement.
    - j'ai reconstruit 1 index là où ma procédure prend le plus de temps mais ça ne change quasi rien à la durée d'exécution
    (=> j'ai trouvé qu'un filtre type "date between xxx and xxx" était la cause de la lenteur de ma PS)

    Comme je l'ai dit dans mon précédent message, la seule différence que je vois entre mes 2 bdd est la connexion pour l'une à Reporting Services.

    Note que 'reporting services' est un engin très capricieux: les modifications du SQL doit être fait dans le studio sinon il semble (je me suis salement battu avec la chose) que l'optimisation n'ait pas lieu.
    Je n'ai pas compris... tu parles de la modification de la PS ?

    @elsuket : non, ma base de test et celle de production ne sont pas sur le même serveur. J'ai donc pensé à des sollicitations de la base plus importante en production qu'en développement.

    Ce qui me paraît étrange c'est que ce problème de performance est apparu du jour en lendemain. La taille de la bdd n'a pas doublé en une nuit, est-ce que quelques données "de trop" peuvent suffire à tout foutre en l'air ?
    (Je précise que ce n'est pas moi qui administre le serveur et la bdd)

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 55
    Points : 78
    Points
    78
    Par défaut Comportement étrange de procédures stockées.
    Bonjour StichP,

    Bin non, je ne te prends pas pour une truffe...Mais j'ai fais 2,5 années comme Academic Support pour l'université Concordia et là, vraiment, j'en ai vu de toutes les couleurs.

    Si les 2 PS sont identiques (tien, pourquoi 2 PS?) alors il est possible que les 2 BD, elles, ne le sont pas. Je te suggère le shareware que tu vas trouver au site suivant:

    http://www.sqldbtools.com/

    Je ne l'ai jamais utilisé mais ça semble OK; se méfier cependant car j'ai attrapé SearchNu en procédant selon les instructions d'un participant...

    Oui, je parlais du PS; car si mes souvenirs sont justes (et ils ne le sont pas toujours), Report Services garde une version locale de la requête utilisée.

    As-tu, sans préjudice, déconnecté la BD du Report Services et tourné ta ou tes 2 PS?

    Quel mystère,
    JLCantara.

  11. #11
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mars 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 130
    Points : 93
    Points
    93
    Par défaut
    Bonjour

    alors, 2 procédures stockées : celle de production, celle de développement.

    As-tu, sans préjudice, déconnecté la BD du Report Services et tourné ta ou tes 2 PS?
    Ma bdd est bien connectée à Reporting Services (elle est en DataSource).

    J'ai finalement résolu mon problème de performance en déportant le filtre sur les dates dans mon rapport (et non plus dans la procédure stockée).
    Ce n'est certainement pas la solution la plus propre, mais je réduis de 80% mon temps d'exécution.

    Merci encore à tout pour vos réponses, même si je n'ai pas vraiment trouvé la cause de mon problème...

    Bonne journée !

  12. #12
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    J'ai finalement résolu mon problème de performance en déportant le filtre sur les dates dans mon rapport (et non plus dans la procédure stockée).
    Cela signifie à priori qu'il manque un index sur la colonne date ...

    Le mieux est que vous donniez le plan d'exécution réel (CTRL+M avant d'exécuter la procédure stockée) sur les deux bases de données, et que vous précédiez les deux EXEC par un SET STATISTICS IO ON.
    Une fois généré, faites un clic-droit dans une zone vierge du plan, enregistrez les deux plans, et mettez-les en pièce attachée à votre prochain post



    @++

  13. #13
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mars 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2007
    Messages : 130
    Points : 93
    Points
    93
    Par défaut
    Cela signifie à priori qu'il manque un index sur la colonne date ...
    Oui... En fait la requête porte sur une vue. Dans la table sur laquelle s'appuie la vue, il y un index sur la date + un autre champ.

    Je relancerai les procédures stockées selon la procédure indiquée dans votre post et je mettrai le résultat.

    Merci encore

Discussions similaires

  1. Procédure stockée : comportement instable
    Par dgi77 dans le forum PL/SQL
    Réponses: 11
    Dernier message: 25/10/2007, 18h30
  2. Procédure stockée : comportement instable
    Par dgi77 dans le forum SQL
    Réponses: 11
    Dernier message: 25/10/2007, 18h30
  3. Réponses: 18
    Dernier message: 04/04/2007, 14h34
  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