有没有办法克服SQL Server中的参数嗅探?

时间:2016-02-18 09:33:38

标签: sql-server sql-server-2008-r2 parameter-sniffing

当我的一个查询执行时间比预期长得多时,我遇到了参数嗅探。当我深入研究这个问题时,我开始知道:

  

当第一次执行查询时,它(SQL Server)为该查询创建执行计划,并且执行相同查询的其他n次,如果在第一次执行时结果集中存在较大差异,则会出现参数嗅探问题&#34 ;

这是我的情景。

现在我的问题是,在这些情况下,有没有办法或解决方法来克服SQL Server中的参数嗅探?

  • 我知道通过运行sp_updatestats我可以验证它是否正在发生。

  • 我也知道要抓住这个问题,我需要通过query_hash的{​​{1}}和query_plan_hash字段来监控程序缓存。我可以这样做。

  • 我不想在sys.dm_exec_query_stats变量部分中使用RECOMPILE,因为这会在每次执行查询时创建新的执行计划。

但是我没有通过在查询本身做某事来验证问题而是想要克服它,我的意思是例如"在运行时检测问题并仅在需要时创建新的执行计划(不是每次) "

我经常面对参数嗅探问题,所以每个有用的建议和帮助将不胜感激。提前谢谢!

2 个答案:

答案 0 :(得分:6)

您可以将选项OPTION(OPTIMIZE FOR UNKNOWN)应用于使用参数的查询,以使查询优化以使用统计信息,而不是针对特定参数进行优化。这绕过了参数嗅探。

在({3}}中解释(概要):

  

未知的优化

     

指示查询优化器在编译和优化查询时使用统计数据而不是所有局部变量的初始值,包括使用强制参数化创建的参数。

答案 1 :(得分:6)

您可以将参数分配给局部变量。

CREATE PROCEDURE SP_NAME

    @param1 INT,
    @param2 INT

AS
DECLARE @local_param1 INT
DECLARE @local_param2 INT

SET @local_param1  = @param1 
SET @local_param2 = @param2 ... 

正如此post所述。将参数分配给局部变量会告诉SQL Server使用静态密度而不是静态直方图,从而避免了参数嗅探问题。