相关疑难解决方法(0)

为什么我的查询突然比昨天慢?

[敬礼]

(检查一个)

[ ] 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

81
推荐指数
4
解决办法
4万
查看次数

SQL Server 基数提示

有没有办法如何将基数估计“注入”到 SQL Server 优化器(任何版本)?

即类似于 Oracle 的基数提示。

我的动机是由这篇文章驱动的,查询优化器真的有多好?[1],他们测试基数估计量对选择一个糟糕计划的影响。因此,如果我可以强制 SQL Server 精确地“估计”复杂查询的基数就足够了。


[1]莱斯、维克多等人。“查询优化器有多好,真的吗?”
VLDB 基金会会议录 9.3 (2015):204-215。

sql-server optimization

17
推荐指数
2
解决办法
3498
查看次数

非常相似的查询,截然不同的性能

我有两个非常相似的查询

第一个查询:

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

9
推荐指数
1
解决办法
236
查看次数

在相关表上执行 WHERE EXISTS 时,两个相似查询之间的差异很大

我正在尝试诊断一个问题,即 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)

sql-server execution-plan

4
推荐指数
1
解决办法
108
查看次数