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

Nai*_*lai 4 sql-server parameter-sniffing sql-server-2008-r2

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

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

这是我的方案.

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

  • 我知道通过跑步sp_updatestats我可以验证它是否正在发生.

  • 同时,我知道要赶上这个问题,我需要监控过程高速缓存,通过query_hashquery_plan_hash领域sys.dm_exec_query_stats我可以做到这一点.

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

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

我经常面对参数嗅探问题,所以非常感谢每一个有用的建议和帮助.提前致谢!

TT.*_*TT. 6

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

这在(简要地)在T-SQL的查询提示中解释:

优化未知

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


小智 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 ... 
Run Code Online (Sandbox Code Playgroud)

作为此解释.将参数分配给局部变量会告诉SQL Server使用静态密度而不是静态直方图,从而避免了参数嗅探问题.