【问题标题】:Parameter sniffing degrades stored procedure performance参数嗅探会降低存储过程的性能
【发布时间】:2015-12-23 18:37:31
【问题描述】:

我使用的是 SQL Server 2012。最近我的所有存储过程都出现了性能问题,但过程中的代码运行速度非常快。

我发现了一些关于参数嗅探的东西,所以我使用定义局部变量技术作为我所有程序的解决方法。

我问自己,为什么在我的所有程序中都会发生这种情况。我唯一的猜测是,那是因为我所有的程序都使用一个 OPTIONAL 参数。

这是我所有程序的标题

CREATE PROC [dbo].[MySampleProc] (@Key  Int = NULL) 
AS
....

我说的对吗?或者你有什么其他想法?

【问题讨论】:

  • 这是因为你的参数值改变了,缓存的计划可能不是最适合新值的。这就是参数嗅探的本质。 sqlinthewild.co.za/index.php/2007/11/27/parameter-sniffing
  • 尝试重新编译提示sqlmag.com/sql-server/…
  • @SeanLange 关键是由于我的数据性质,我在过程中的所有查询都将返回几乎相同的记录数。我的意思是我传递给程序的任何值都会导致 200k 或 250k 记录之间的一些东西。所以基本上计划对于任何参数都应该是相同的。
  • @VojtěchDohnal 我使用 WITH RECOMPILE 也使用了 sp_recompile 但没有区别。顺便说一句,我已经通过使用局部变量解决了这个问题,现在我试图理解为什么参数嗅探对于我所有的 15 个程序来说都是一个问题!
  • 这个问题可以用例子重现吗?

标签: sql-server query-performance parameter-sniffing


【解决方案1】:

也许不是参数嗅探,而是过时的统计信息。使用局部变量(或 OPTIMIZE FOR UNKNOWN 查询提示),行计数估计基于平均密度。但是,在指定参数时会使用实际的统计数据直方图值,因此当统计数据过时时行数估计值将关闭。

尝试使用FULLSCAN 更新统计信息。

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 2019-01-18
    • 2012-08-04
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多