[敬礼]
(检查一个)
[ ] Well trained professional, [ ] Casual reader, [ ] Hapless wanderer,
Run Code Online (Sandbox Code Playgroud)
我有一个(检查所有适用的)
[ ] query [ ] stored procedure [ ] database thing maybe
Run Code Online (Sandbox Code Playgroud)
运行良好(如果适用)
[ ] yesterday [ ] in recent memory [ ] at some point
Run Code Online (Sandbox Code Playgroud)
但现在突然变慢了。
我已经检查过以确保它没有被阻止,并且它不是某些长时间运行的维护任务、报告或其他带外进程的受害者。
有什么问题,我应该怎么做,我可以提供哪些信息来获得帮助?
[*Insert appropriate closing remarks*]
Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan parameter-sniffing query-performance
有没有办法如何将基数估计“注入”到 SQL Server 优化器(任何版本)?
即类似于 Oracle 的基数提示。
我的动机是由这篇文章驱动的,查询优化器真的有多好?[1],他们测试基数估计量对选择一个糟糕计划的影响。因此,如果我可以强制 SQL Server 精确地“估计”复杂查询的基数就足够了。
[1]莱斯、维克多等人。“查询优化器有多好,真的吗?”
VLDB 基金会会议录 9.3 (2015):204-215。
我有两个非常相似的查询
第一个查询:
SELECT count(*)
FROM Audits a
JOIN AuditRelatedIds ari ON a.Id = ari.AuditId
WHERE
ari.RelatedId = '1DD87CF1-286B-409A-8C60-3FFEC394FDB1'
and a.TargetTypeId IN
(1,2,3,4,5,6,7,8,9,
11,12,13,14,15,16,17,18,19,
21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,
41,42,43,44,45,46,47,48,49,
51,52,53,54,55,56,57,58,59,
61,62,63,64,65,66,67,68,69,
71,72,73,74,75,76,77,78,79)
Run Code Online (Sandbox Code Playgroud)
结果:267479
计划:https : //www.brentozar.com/pastetheplan/?id=BJWTtILyS
第二个查询:
SELECT count(*)
FROM Audits a
JOIN AuditRelatedIds ari ON a.Id = ari.AuditId
WHERE
ari.RelatedId = '1DD87CF1-286B-409A-8C60-3FFEC394FDB1'
and a.TargetTypeId IN
(1,2,3,4,5,6,7,8,9,
11,12,13,14,15,16,17,18,19,
21,22,23,24,25,26,27,28,29,
31,32,33,34,35,36,37,38,39,
41,42,43,44,45,46,47,48,49,
51,52,53,54,55,56,57,58,59,
61,62,63,64,65,66,67,68,69,
71,72,73,74,75,76,77,78,79)
Run Code Online (Sandbox Code Playgroud)
结果:25650
计划:https : //www.brentozar.com/pastetheplan/?id=S1v79U8kS
第一个查询大约需要一秒钟才能完成,而第二个查询大约需要 20 秒。这对我来说完全违反直觉,因为第一个查询的计数比第二个查询高得多。这是在 SQL Server 2012 上
为什么差别这么大?如何将第二个查询加速到与第一个查询一样快?
这是两个表的创建表脚本:
CREATE TABLE [dbo].[AuditRelatedIds](
[AuditId] …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization execution-plan query-performance
我正在尝试诊断一个问题,即 2 个非常相似的查询导致执行时间非常不同,即使执行计划非常简单。
大体上(我已经修剪了选择和重命名的表),我们有一个主表 ( [Primary]),我们试图根据相关表中至少 1 个匹配行的存在进行过滤。然后我们返回前 20 行(用于分页)
查询之间唯一的区别是相关表不同(尽管具有相似的结构)。快速查询 ( [PrimaryResult]) 需要 < 1 秒,而慢查询 ( [PrimaryScore]) 需要 20 秒左右。
我检查了执行计划,主要区别在于主表上的键查找。在快速查询中,Actual number of rows read大约为 10k,而对于慢速查询,它超过 360 万。
我观察到的另一件事是快速查询似乎并行执行所有操作(由执行计划中的双箭头表示,但慢速查询没有)。
查询是通过 Entity Framework 6 LINQ 生成的(因此所有别名)。
慢查询
SELECT
[Project5].[Id] AS [Id]
FROM ( SELECT
[Project1].[Id] AS [Id]
FROM ( SELECT
[Extent1].[Id] AS [Id]
FROM [dbo].[Primary] AS [Extent1]
INNER JOIN [dbo].[GuidBatch] AS [Extent2] ON ([Extent1].[DeviceRegistrationId] = [Extent2].[Ref]) AND (@p__linq__0 = [Extent2].[Id])
INNER JOIN [dbo].[Place] AS …Run Code Online (Sandbox Code Playgroud)