【发布时间】:2011-01-19 14:11:56
【问题描述】:
我有一个生成以下 SQL 的 LINQ to 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 Server 2008 上的 SQL Profiler 获取的实际 SQL。)
当我在Query Analyser 中运行此 SQL 时生成的查询计划是完美的。
它使用包含VisitedStore、Bot、SessionDate 的索引。
查询立即返回。
但是,当我从 C#(使用 LINQ)运行此程序时,使用了不同的查询计划,该计划效率非常低,甚至在 60 秒内都不会返回。该查询计划试图对包含几百万行的集群主键进行键查找。它没有机会返回。
但我无法理解的是,正在运行完全相同的 SQL - 无论是从 LINQ 内部还是从查询分析器内部,但查询计划却不同。
我已经多次运行这两个查询,现在它们独立于任何其他查询运行。日期是 DateTime.Now.AddDays(-7),但我什至硬编码了该日期以消除缓存问题。
我可以在 LINQ to SQL 中更改什么来影响查询计划或尝试进一步调试吗?我很困惑!
【问题讨论】:
-
如何查看不同上下文的执行计划:stackoverflow.com/questions/7359702/…