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].
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' |
Partager