[敬礼]
(检查一个)
[ ] 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
过去我使用过两种方法来解决参数嗅探问题:
1) 使用WITH RECOMPILE
2) 将参数值重新分配给局部变量并使用这些值代替参数
据我了解,这两者的最终结果是相同的 - 创建并使用针对当前查询/参数优化的新执行计划。
如果这是真的,这两种方法之间有什么区别吗,或者它们本质上是一样的?一个比另一个更可取吗?
好的,所以我有一个我们在 SSRS 报告中使用的非存储过程查询。这个查询非常慢(过去两个小时我已经运行了这个查询的原始版本,但仍未完成),为了改进它,我从头开始重写它,我想出了以下内容:
现在这里是无聊的单词问题部分:
我们希望为TOP 5每个销售代表提取一份客户列表,但从该列表中排除所有TOP 10客户。(因此,如果 John Doe 有客户 A、B、C、D 和 E,而客户 C 是前 10 名之一,则只提取 A、B、D 和 E。)
为此,第一个查询使用了IN (... NOT IN ( ) ),所以我认为是嵌套IN的问题,为了重写它,我做了一个OUTER APPLY真正打破一切的查询。
无论如何,我修复了所有这些并运行了查询,但仍然需要 10-15 秒,我认为这是参数嗅探。为了进行调查,我在 SSMS 中运行了查询,添加了OPTION (RECOMPILE)(查看会生成什么查询计划),并得到以下内容:
可以在 Brent Ozar 的“粘贴计划”中查看此处。生成这个的查询是:
DECLARE @Top10Temp TABLE (Id INT)
INSERT INTO @Top10Temp
SELECT TOP 10 Id
FROM Object1
WHERE Column2 = @ReportId
AND Column3 …Run Code Online (Sandbox Code Playgroud) sql-server optimization execution-plan sql-server-2014 parameter-sniffing
这两个设置似乎相互矛盾。One 强制计划参数化,以便只创建一个计划。另一个允许多个计划
如果您有参数化 = 强制,参数嗅探应该是假的,还是优先?
额外细节
关于下面的评论,参数嗅探是SS 2016的数据库范围选项。(我也很惊讶)。另请参阅:SQLShack:SQL Server 2016 参数嗅探
我在 SQL Server 2012 中有一个优化的查询,它持续运行大约 1-3 秒。
当我在 SSMS 中运行它时,它运行得很快,但是当应用程序执行它时(通过sp_executesql),它真的很慢,对于较大的数据大约需要 13 分钟。
在应用程序中进行一些挖掘和阅读之后,在 SSMS 中速度很快?,我得出结论,参数嗅探有问题(有一个参数)。
我禁用了它,OPTION (QUERYTRACEON 4136)它可以快速运行sp_executesql。
这是一个好主意(我应该保留禁用参数嗅探的选项)还是我应该调整查询以使其与sp_executesql参数嗅探一起使用?
对于几个场景,我们很少看到在存储过程上执行 sp_recompile 以提高性能。
作为一名 DBA,我了解执行 sp_recompile 时涉及的一些注意事项以及为什么它可以提高性能。
我们的管理层一直在争论,当他们看到上述性能问题时,为应用程序/开发 DBA 提供执行 sp 重新编译的访问权限。只是为了减少 DBA 的参与,APP 开发人员可以在性能问题期间继续运行
我很犹豫,因为我认为它会带来一些不需要的行为,有时甚至会恶化其他 proc 的性能。
我正在寻求专家的一般指导和经验,为什么这在可能的不同情况下或在理想情况下可能是个坏主意。您的输入可能会帮助我设计,并可能以不同的方式解释该方法。
仅供参考 - 在看到参数嗅探等问题时,上述问题不仅被认为是一个应用程序,而且被认为是其他少数应用程序的自动化。
sql-server sql-server-2014 sql-server-2017 parameter-sniffing
我有一张表,其中包含 10 年的“包扫描”。有人扫描包裹并记录日期和用户名。现在让我们假设保留 10 年的数据实际上是有目的的。
我有一个页面显示过去一周的摘要,所以显然我只想阅读 1 周的数据。
以下是要在 SSMS 中运行两次的查询,一次使用硬编码的最近日期,另一次使用2013 年的旧日期。它最初是一个参数化查询,但在 SSMS 中我用@p0日期替换:
SELECT [t0].[VerifyDate], [t0].[PackageId], [t0].[Username]
FROM [dbo].[PackageVerification] AS [t0]
INNER JOIN [dbo].[Package] AS [t1] ON [t1].[PackageId] = [t0].[PackageId]
WHERE ([t1].[PackageStatus] <> 99) AND ([t0].[VerifyDate] > @p0)
ORDER BY [t0].[VerifyDate] DESC
Run Code Online (Sandbox Code Playgroud)
在执行之前,我想介绍一下我的日期索引。
现在,我的日期索引不在我的PackageVerification表上,而是在“辅助视图”上,该视图执行与上面所示的相同的连接。上面的查询能够神奇地使用这个索引视图,因为我启用了 SCHEMABINDING。
CREATE NONCLUSTERED INDEX [IX_Helper_PackageVerification_USER_SCAN_HISTORY] ON [dbo].[Helper_PackageVerification]
(
[VerifyDate] DESC,
[PackageStatus] ASC
)
INCLUDE (
[VerifyDateDate],
[Username]
)
Run Code Online (Sandbox Code Playgroud)
当我在 SSMS 中使用旧日期和新日期运行查询时,它会按预期使用扫描或查找。阈值似乎在 2015 年左右。所以任何最近的事情肯定都应该使用搜索。这是结果:
当我从应用程序中将其作为参数化查询运行时,我总是会得到完整扫描 …
sql-server execution-plan azure-sql-database parameter-sniffing
我最近处理了一个有问题的存储过程。有时,跑得非常快,有时,跑得非常非常长。我确定错误的参数嗅探是原因。
仅供参考 - 过程中的参数是日期时间,查询使用这些参数来搜索日期范围。
无论如何,这就是我的尝试:
WITH RECOMPILE- 没有帮助OPTION (RECOMPILE)- 没有帮助OPTION (OPTIMIZE FOR UNKNOWN)- 运行速度快为了帮助我理解......使用局部变量和OPTIMIZE FOR UNKNOWN使用平均密度统计数据来制定计划的方式完全相同吗?
我也尝试了几种组合:
OPTIMIZE FOR UNKNOWN & OPTION (RECOMPILE) - 运行速度快OPTION (RECOMPILE) - 运行缓慢我已经了解了使用的潜在危险OPTIMIZE FOR UNKNOWN,并且在很多情况下,使用局部变量被提出来,就好像它是同一件事一样。这让我认为这是同一件事。
但是 - 我该如何解释尝试 6 运行缓慢。
我想说的是,是的,统计数据已更新,但采样率低于 0% - 表很大 +- 16 亿行。
可能还值得注意 - 我使用了 Awesomesp_blitzcache并在特定过程上进行了过滤 - 它有一个编译超时警告 - 我的直觉告诉我这是这里需要注意的事情。
有很多关于可用于减轻不良参数嗅探的某些方法的极好信息,但关于如何识别不良参数嗅探问题的信息并不多。
假设您没有使用 SQL Server 2016,因此无法利用查询存储,并且您没有用户抱怨有问题的存储过程间歇性地执行不佳,那么可以使用哪些方法来主动识别错误的参数嗅探问题?
利用扩展事件、RML 实用程序和简单地查询/轮询 DMV 似乎都是可行的方法,有没有人有使用这些方法中的任何一个的方法或知道任何描述如何执行此操作的好资源?
我正在尝试优化服务器的性能,这个特定的查询导致从数据库中读取大量数据,进而导致查询超时。此查询是从 Asp.Net MVC 中的 EF6 生成的。
这是有问题的查询:
exec sp_executesql N'SELECT
[Project1].[C1] AS [C1],
[Project1].[Date] AS [Date],
[Project1].[AssetID] AS [AssetID],
[Project1].[EventData] AS [EventData]
FROM ( SELECT
[Extent1].[AssetID] AS [AssetID],
[Extent1].[Date] AS [Date],
[Extent1].[EventData] AS [EventData],
1 AS [C1]
FROM [dbo].[Alarm] AS [Extent1]
WHERE ([Extent1].[AssetID] IN (cast(''c6e3142e-5b1f-4a91-90d2-03a504e86ece'' as uniqueidentifier), cast(''4de25e8a-7401-49ae-bd6d-0861d67f0d2f'' as uniqueidentifier), cast(''455e3a5f-1091-4784-9964-0a1a54eaa644'' as uniqueidentifier), cast(''04b46c21-c44f-4b67-b64b-12f2764c0448'' as uniqueidentifier), cast(''a350992b-8548-4bf1-bd22-131c114a5343'' as uniqueidentifier), cast(''98ec1f36-cc54-45d2-a0e3-22aa1b669373'' as uniqueidentifier), cast(''27abcf37-2093-43d5-ae62-2e7b10fe4692'' as uniqueidentifier), cast(''c9f43598-2b9c-47b0-9230-37440e6aea54'' as uniqueidentifier), cast(''c5964caa-5c73-4c0e-bb80-4c1dc7e11039'' as uniqueidentifier), cast(''6ac30678-3876-43c9-b708-61ef19b5ea17'' as uniqueidentifier), cast(''e69d870a-87de-4e3d-b4fc-62c962489a7b'' as uniqueidentifier), cast(''a7c2f407-c605-4491-85fe-66c16fc15586'' as uniqueidentifier), …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization parameter-sniffing query-performance