这个问题是一个后续到This Question为什么此查询超时? V2
的解决方案,清理执行计划缓存在当时似乎工作,但我一直在运行到同样的问题,一遍又一遍,并清除缓存不再似乎有帮助。这里一定有更深层次的问题。
我发现如果从查询中删除.Distinct(),它会在大约2秒内返回行(带有重复项)。但是,使用.Distinct()需要4分钟才能完成。表中有很多行,并且某些where子句字段没有索引。但是,返回的记录数量相当小(最多几十个)。
令人困惑的是,如果我通过Linqpad获取由Linq查询生成的SQL,然后将该代码作为SQL或在SQL Management Studio中执行(包括DISTINCT),它将在大约3秒内执行。
Linq查询和执行的SQL有什么不同?
我有一个短期的解决方法,这就是返回没有.Distinct()作为列表,然后使用.Distinct在列表上,这大约需要2秒。但是,我不喜欢在Web服务器上执行SQL Server工作。
我想了解为什么Distinct在Linq中慢了2个数量级,而不是SQL。
UPDATE:
当执行经由LINQ的代码中,SQL分析器显示该代码,这是基本相同的查询。
sp_executesql N'SELECT DISTINCT [t5].[AccountGroupID], [t5].[AccountGroup]
AS [AccountGroup1]
FROM [dbo].[TransmittalDetail] AS [t0]
INNER JOIN [dbo].[TransmittalHeader] AS [t1] ON [t1].[TransmittalHeaderID] =
[t0].[TransmittalHeaderID]
INNER JOIN [dbo].[LineItem] AS [t2] ON [t2].[LineItemID] = [t0].[LineItemID]
LEFT OUTER JOIN [dbo].[AccountType] AS [t3] ON [t3].[AccountTypeID] =
[t2].[AccountTypeID]
LEFT OUTER JOIN [dbo].[AccountCategory] AS [t4] ON [t4].[AccountCategoryID] =
[t3].[AccountCategoryID]
LEFT OUTER JOIN [dbo].[AccountGroup] AS [t5] ON [t5].[AccountGroupID] =
[t4].[AccountGroupID]
LEFT OUTER JOIN [dbo].[AccountSummary] AS [t6] ON [t6].[AccountSummaryID] =
[t5].[AccountSummaryID]
WHERE ([t1].[TransmittalEntityID] = @p0) AND ([t1].[DateRangeBeginTimeID] = @p1) AND
([t1].[ScenarioID] = @p2) AND ([t6].[AccountSummaryID] = @p3)',N'@p0 int,@p1 int,
@p2 int,@p3 int',@p0=196,@p1=20100101,@p2=2,@p3=0
UPDATE:
唯一的区别查询之间是LINQ的与sp_executesql的执行它和SSMS不,否则查询是相同的。
UPDATE:
我曾尝试过各种事务隔离级别无济于事。我还设置ARITHABORT在执行时试图强制重新编译,并且没有区别。
好吧,当我添加执行计划告诉我的缺失索引时,问题就消失了。选择一个更好的计划,虽然不像非参数化查询那样并行,但它是亚秒级的响应时间。 – 2010-08-03 22:34:37