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 :

Requête lente avec des paramètres variables


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Architecte technique
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Requête lente avec des paramètres variables
    Bonjour , je rencontre actuellement un problème sur SQL server 2008 R2 , un cas assez particulier , j’ai une requête avec deux paramètres quand je passe , les paramètres en dur et sans ça : exec sp_executesql , la requête s’exécute en moins d’une seconde et quand je déclare deux variables du même type que mes champs utilisé dans ma clause where et que j’affecte les deux valeur Int à mes deux variables Int, ma requête s’exécute en 4s sans exec sp_executesql, je ne comprends pas pourquoi cela se produit , au début je croyais que cela était lié à un problème de renfilage de paramètre . En fait à la base c’est une requête linq que j’ai capturé par le profiler SQL , je croyais que le problème était également lié du faite que la requête était exécuté par : exec sp_executesql N', mais apparemment pas par ce que en ré exécutant la même requête sans exec sp_executesql N' elle fait 4s le même temps qu’elle fait dans l’application(linq) par contre si je l’exécute sans exec sp_executesql N' et en faisant un déclare de mes deux paramètres : delcare int @p__linq__2 et select @p__linq__2 =6555 ensuite declare @p__linq__1 et select =@p__linq__1=6555, elle fait mois d’une seconde et genere un bon plan dexecution avec que des seekIndex et celle généré avec linq fait un scan d’index sur une table en particulier et je crois que le problème viens de là, je ne comprends pas pourquoi en exécutant simplement la requête avec des déclare de mes paramètres dans mon éditeur SQL server mon scan index se produit, , j’ai essayé d’optimiser la requete generé par linq , mais l’optimiseur refuse d’utiliser mon index , et en exécutant la requête avec un déclare de mes paramètres et sans sans exec sp_executesql ma requête fait moins 1s et mon indexé et bien utilisé avec un seekindex, alors en faisant un force index evidement , elle fait moins 1s



    [CODE]
    exec sp_executesql N'SELECT
    [Limit1].[C1] AS [C1],
    [Limit1].[C2] AS [C2]
    FROM ( SELECT TOP (1)
    [Project2].[C1] AS [C1],
    [Project2].[C2] AS [C2]
    FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
    LEFT OUTER JOIN (SELECT
    1 AS [C1],
    CASE WHEN ([Extent1].[CODE] IS NOT NULL) THEN [Extent1].[PRENOM] + N'' '' + [Extent1].[NOM] ELSE @p__linq__3 END AS [C2]
    FROM [dbo].[personne] AS [Extent1]
    WHERE EXISTS (SELECT
    1 AS [C1]
    FROM [dbo].[EQUIPE] AS [Extent2]
    INNER JOIN [dbo].[TABLE2] AS [Extent3] ON ([Extent2].[CODE] = [Extent3].[USERCODE]) OR (([Extent2].[CODE] IS NULL) AND ([Extent3].[USERCODE] IS NULL))
    WHERE ([Extent2].[CODE] IS NOT NULL) AND ([Extent2].[TYPE_ACTEUR] IN ('' technico commercant'')) AND ((CASE WHEN (0 = @p__linq__0) THEN CASE WHEN ([Extent2].[COMMANDE] = @p__linq__1) THEN cast(1 as bit) WHEN ([Extent2].[COMMANDE] <> @p__linq__1) THEN cast(0 as bit) END WHEN ([Extent2].[CONTRAT] = @p__linq__2) THEN cast(1 as bit) WHEN ([Extent2].[CONTRAT] <> @p__linq__2) THEN cast(0 as bit) END) = 1) AND ([Extent2].[CODE] = [Extent1].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    )
    		) ) AS [Project2] ON 1 = 1
    )  AS [Limit1]',N'@p__linq__0 int,@p__linq__2 int,@p__linq__1 int,@p__linq__3 nvarchar(4000)',@p__linq__0=1444,@p__linq__2=1444,@p__linq__1=6555,@p__linq__3=N'BERTRANT'

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    C'est en effet probablement dû a un problème de paramétrisation.

    Que donne la requête avec les paramètres sous forme de variables mais avec un OPTION (RECOMPILE) à la fin ?

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Architecte technique
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    bonjour , merci , j'ai essayé avec cette option à la fin de mon select mais aucun changement merci

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Alors il faudrait les plans d'exécution réels afin de voir d'où provient la différence...

    Est-ce que les statistiques sont à jour sur toutes les tables utilisées dans la requête.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Architecte technique
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Oui , j'ai lancé la mise à jours des statistics avec fullscan , en faite la difference est dans le plan d’exécution , j'ai un fullscan d'index avec la requette qui à les parametres en variables et si je passe les valeurs en dur en parametres la requête fait mois 1s et le meme index sur la meme table sera utilisé avec un seekIndex , le problème viens de parametres

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    quel est le nombre de lignes estimé et réel pour les deux requêtes ?

    Comment mesurez-vous le temps d'exécution ?

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Architecte technique
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    la requête renvoi une seule ligne , le temps d'exécution est mesuré par le timer d'sql server, quand je force l'utilisation de l'indexe la requête fait aussi moins d'une seconde,
    je comprends pas pourquoi en utilisation des variables en parametre je passe d'un seek index à un scan index et je passe de moins d'une seconde à 5s.
    j'ai absolument besoin d'aide et merci pour vos suggestions

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2018, 19h01
  2. Requête "COMME" avec un paramètre variable
    Par patou9999 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/08/2016, 11h47
  3. Réponses: 2
    Dernier message: 17/11/2015, 21h04
  4. Réponses: 2
    Dernier message: 05/07/2007, 14h24
  5. [ADO/Access] Appel d’une requête avec des paramètres
    Par Taxenna dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/12/2004, 14h58

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