【发布时间】: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