J'ai une requête LINQ to SQL qui génère l'instruction SQL suivante:'plan de requête LINQ' horriblement inefficace mais 'plan de requête Query Analyzer' est parfait pour le même SQL!
exec sp_executesql N'SELECT COUNT(*) AS [value]
FROM [dbo].[SessionVisit] AS [t0]
WHERE ([t0].[VisitedStore] = @p0) AND (NOT ([t0].[Bot] = 1)) AND
([t0].[SessionDate] > @p1)',N'@p0 int,@p1 datetime',
@p0=1,@p1='2010-02-15 01:24:00'
(Ceci est le SQL réelle prise de SQL Profiler sur SQL Server 2008.)
Le plan de requête généré quand je lance cette SQL de Query Analyser
est parfait. Il utilise un index contenant VisitedStore
, Bot
, SessionDate
. La requête retourne instantanément.
Toutefois, lorsque j'exécute ceci à partir de C# (avec LINQ), un plan de requête différent est utilisé qui est si inefficace qu'il ne revient même pas en 60 secondes. Ce plan de requête tente d'effectuer une recherche de clé sur la clé primaire en cluster contenant quelques millions de lignes. Il n'a aucune chance de revenir. Ce que je ne peux tout simplement pas comprendre, c'est que le même SQL EXACT est en cours d'exécution - soit à partir de LINQ ou à partir de Query Analyzer mais le plan de requête est différent.
J'ai couru les deux requêtes plusieurs fois et elles fonctionnent maintenant isolément de toutes les autres requêtes. La date est DateTime.Now.AddDays(-7)
, mais j'ai même codé en dur cette date pour éliminer les problèmes de mise en cache.
Y at-il quelque chose que je peux changer dans LINQ to SQL pour affecter le plan de requête ou essayer de déboguer cela plus loin? Je suis très très confus!
Comment afficher le plan d'exécution dans différents contextes: http://stackoverflow.com/questions/7359702/how-do-i-obtain-a- query-execution-plan –