【发布时间】:2011-03-24 10:18:45
【问题描述】:
这个问题是This Question的后续问题
解决方案,当时清除执行计划缓存似乎有效,但我一遍又一遍地遇到同样的问题,清除缓存似乎不再有帮助。这里肯定有更深层次的问题。
我发现如果我从查询中删除 .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 中没有。
更新:
通过 Linq 执行代码时,sql profiler 显示这段代码,基本上是相同的查询。
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
更新:
查询之间的唯一区别是Linq使用sp_executesql执行它而SSMS没有,否则查询是相同的。
更新:
我尝试了各种事务隔离级别,但均无济于事。我还设置了 ARITHABORT 在执行时尝试强制重新编译,没有区别。
【问题讨论】:
标签: asp.net performance linq-to-sql sql-server-2008 .net-3.5