gpt4 book ai didi

sql-server - “LINQ 查询计划”效率极低,但 'Query Analyser query plan' 对于相同的 SQL 来说是完美的!

转载 作者:行者123 更新时间:2023-12-02 10:23:48 25 4
gpt4 key购买 nike

我有一个 LINQ to SQL 查询,它生成以下 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。)

当我从查询分析器中运行此 SQL 时生成的查询计划是完美的。它使用包含 VisitedStoreBotSessionDate 的索引。查询立即返回。

但是,当我从 C#(使用 LINQ)运行此命令时,使用了不同的查询计划,效率非常低,甚至在 60 秒内都不会返回。该查询计划尝试对包含几百万行的聚集主键进行键查找。它没有机会返回。

但我无法理解的是,正在运行完全相同的 SQL - 无论是从 LINQ 内部还是从查询分析器内部运行,但查询计划是不同的。

我已经多次运行这两个查询,它们现在与任何其他查询隔离运行。日期是 DateTime.Now.AddDays(-7),但我什至对该日期进行了硬编码以消除缓存问题。

我可以在 LINQ to SQL 中更改任何内容来影响查询计划或尝试进一步调试吗?我非常非常困惑!

最佳答案

这是一个比较常见的问题,我第一次看到的时候也很惊讶。首先要做的是确保您的统计数据是最新的。您可以通过以下方式检查统计年龄:

SELECT 
object_name = Object_Name(ind.object_id),
IndexName = ind.name,
StatisticsDate = STATS_DATE(ind.object_id, ind.index_id)
FROM SYS.INDEXES ind
order by STATS_DATE(ind.object_id, ind.index_id) desc

统计数据应在每周维护计划中更新。要快速修复,请发出以下命令来更新数据库中的所有统计信息:

exec sp_updatestats

除了统计数据之外,您还可以检查的另一件事是 SET options 。它们在查询分析器和 Linq2Sql 应用程序之间可能有所不同。

另一种可能性是 SQL Server 正在为您的 Linq2Sql 查询使用旧的缓存计划。计划可以基于每个用户进行缓存,因此如果您以不同的用户身份运行查询分析器,则可以解释不同的计划。通常,您可以将Option (RECOMPILE) 添加到应用程序查询中,但我想这对于 Linq2Sql 来说很难。您可以使用 DBCC FREEPROCCACHE 清除整个缓存,看看这是否会加快 Linq2Sql 查询的速度。

关于sql-server - “LINQ 查询计划”效率极低,但 'Query Analyser query plan' 对于相同的 SQL 来说是完美的!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com