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 :

Temps d'exécution de requête différent entre SSMS et C#


Sujet :

Développement SQL Server

  1. #1
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut Temps d'exécution de requête différent entre SSMS et C#
    Bonjour à tous,

    Je suis confronté à un problème cornéllien sur mon application.

    J'ai eu des remontées utilisateurs sur un problème de performance sur un écran de recherche de mon application web ASP.NET / SQL Server 2008 R2.

    Nous avons optimisé la requête SQL via SSMS pour passer dans un temps d'exécution avoisinant les 3 secondes.

    Mais nous avons eu de nouveaux retours utilisateur nous informant que le problème n'était pas résolu.

    Quand je regarde ma requête de 3 secondes sous SQL Server Profiler (pour voir le temps d'exécution C# applicatif), je me suis rendu compte que le temps d'exécution de cette même requête était de 40 secondes.

    Comment cela est-ce possible?

    Je précise que c'est exactement le même code qui est exécuté (j'ai C/C la requête de SQL Server Profiler dans SSMS).

    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Est-ce que tu compares bien les mêmes valeurs entre SSMS et SQL Server Profiler ? Question bête, mais c'est juste pour être sûr que la comparaison se fait bien sur des chiffres comparables

    Quel provider utilises-tu pour ton application C# ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Hello et merci de ta réponse.

    Alors je ne peux que comparer les mêmes valeurs car j'ai fais un copier coller de la requête dans les traces de SQL Server Profiler.

    En provider, je suis sur du provider de base du framework .NET (utilisation de SqlCommand du namespace System.Data.SqlClient).

    Aurais-tu une piste à me donner?
    Toute idée est bonne à prendre.

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Des pistes il peut y en avoir plusieurs. Il faut d'abord noter qu'il y a des différences entre la connexion établie par SSMS et celle établie par ton application. Il y a également une différence dans les instructions SET qui passent.

    En principe SQL Server Profiler te permet de voir les différences (il faut regarder juste avant le passage de la requête).

    Une autre chose à prendre en compte c'est qu'il y a peut-être un effet de cache avec SSMS. Si la première exécution de la requête est lente, et que les suivantes sont très rapides, c'est que les résultats sont mis en cache, ce qui peut donc fausser ta comparaison de perfs.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Merci de ton retour.

    De quelle manière peut-on désactiver ces mécasnisme de cache sous SSMS pour se mettre dans une situation quasi applicative?

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Déjà je pense qu'il faut que tu vérifies si le cache t'impacte effectivement. Pour vider le cache, tu peux passer le code suivant :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    USE <YOURDATABASENAME>;
    GO
    CHECKPOINT;
    GO
    DBCC DROPCLEANBUFFERS;
    GO
    (source : Clearing Cache for SQL Server Performance Testing)

    Je te suggère de le passer une fois, puis de relancer une fois ta requête et de noter le temps d'exécution. Refais ça 3 ou 4 fois et compare les résultats.

    Ensuite tu peux faire le test d'exécuter 5 fois ta requête, en prenant soin au préalable de vider le cache avant chaque exécution. Ensuite tu compares les résultats.

    [EDIT] : en fouillant un peu sur Google, je suis tombé sur ça : Slow in the Application, Fast in SSMS? Understanding Performance Mysteries
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Est ce que ta requête utilise des paramètres ? Est ce que ton application lance d'autres requêtes simultanément sur les mêmes objets ?
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  8. #8
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    darkelend, oui et oui.

    DotNetMatt, je vais faire les tests et je te dis.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    - Comment passes tu les paramètres à la requête ? En concatenant tout dans un string ou en utilisant les SqlParameter ?
    - Pour les autres requêtes, il faudrait voir si tu n'as pas un lock. Tu peux le voir avec profiler par exemple.
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  10. #10
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Bon j'avance dans mon analyse.

    DotNetMatt, le vidage du cache de SSMS avant le passage de la requête la fait passer à 20 secondes.

    Mais je suis toujours sur un ordre de 40 secondes avec mon application ASP.net.

    darkelend, mes paramètres sont passés via SQLParam en effet, ce qui donne une requête de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    exec sp_executesql N'-- ./ma_page
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
     
    SELECT COUNT(*)
    <le reste de ma requete>
     
    SELECT *
    <le reste de ma requete>
     
    SET TRANSACTION ISOLATION LEVEL read committed',
    N'@timestamp datetime,@searchString varchar(8000),@contact_id int,@date_from datetime,@date_to datetime',
    @timestamp='2013-09-11 14:02:53.450',
    @searchString=NULL,
    @contact_id=447,
    @date_from=NULL,
    @date_to=NULL
    Avez-vous d'autres pistes d'analyse pour arriver à un temps d'exécution iso-applicatif et ainsi, garantir mon optimisation via SSMS?

  11. #11
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Regarde le second lien que je t'ai posté (Slow in the Application, Fast in SSMS? Understanding Performance Mysteries) tu as plein de scénarios que tu peux tester.

    Avant de te lancer, tu peux aussi regarder si ça ne vient pas des instructions SET. Lance le profiler puis exécute ta requête. Juste avant le passage de la requête, tu dois pouvoir récupérer ces instructions.

    Ensuite dans ton appli, exécute les avant ta requête pour voir si ça change quelque chose ou pas...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  12. #12
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut
    J'ai déjà eu ce genre de problème. Cela venait de l'option ARITHABORT.

    Essayer de faire un SET ARITHABORT ON dans la transaction lancée depuis le C#

    Si ça marche et ça vous intéresse vous allez trouver plus de détails ici
    "Toute technologie suffisamment avancée est indiscernable de la magie." - Arthur C. Clarke

    Evan Barke - Ingénieur d'Etudes et Développement SQL Server
    Blog SQL Server, T-SQL, SSIS, Administration www.transactivesql.com
    Twitter - TransactiveSQL
    N'oubliez pas les boutons et

  13. #13
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Cela peut effectivement venir d'un paramètre de session différent entre ton application et SSMS.

    Ce que je ferais c'est comparer les 2 requêtes avec le profiler ou les événements étendus avec les options de sessions + plan d'exécution utilisé par chaque requête

    ++

Discussions similaires

  1. [2008R2] Nombre de résultats d'une requête différent entre deux exécutions
    Par maxwell374 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/02/2015, 17h39
  2. [WD15] Temps d'exécution des requêtes
    Par thierrybatlle dans le forum WinDev
    Réponses: 7
    Dernier message: 18/02/2010, 16h21
  3. requête différente entre mysql et postgresql
    Par DiverSIG dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/12/2009, 15h05
  4. Erreur OEM 10gR2 - Temps d'exécution des requêtes
    Par fabien.morel2002 dans le forum Administration
    Réponses: 0
    Dernier message: 30/11/2009, 16h00
  5. Resultat de requête différent entre Access et Toad
    Par nicky0007us dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 13/06/2008, 17h57

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