我有一个LINQ to SQL的查询,生成的SQL语句:'LINQ查询计划'可怕的效率很低,但'查询分析器查询计划'对于相同的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'
(这是从SQL事件探查器SQL Server 2008上所采取的实际SQL)
当我运行这个生成的查询计划Query Analyser
中的SQL是完美的。 它使用索引包含VisitedStore
,Bot
,SessionDate
。 查询立即返回。
但是,当我从C#(使用LINQ)运行这个不同的查询计划时,效率非常低,甚至不会在60秒内返回。此查询计划试图对包含几百万行的聚集主键进行密钥查找。它没有返回的机会。
我只是不明白,但是EXACT正在运行相同的SQL - 无论是从LINQ内部还是从查询分析器内部查询计划都不同。
我已经跑了两次查询很多次,他们现在正在孤立于任何其他查询运行。日期是DateTime.Now.AddDays(-7)
,但我甚至对该日期进行了硬编码以消除缓存问题。
有没有什么我可以改变的LINQ to SQL来影响查询计划或尝试进一步调试呢?我非常困惑!
如何查看执行计划,在不同的语境:http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-查询执行计划 –