4

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

当第一次执行查询时,它(SQL Server)为该查询和其他 n 次执行相同的查询创建执行计划,如果第一次执行的结果集差异很大,则出现参数嗅探问题”。

这是在我的场景中。

现在我的问题是,在这些情况下,是否有任何方法或解决方法可以克服 SQL Server 中的参数嗅探?

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

  • 而且我知道要解决这个问题,我需要监控过程缓存,我可以通过query_hash这些query_plan_hash字段sys.dm_exec_query_stats来做到这一点。

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

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

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

4

2 回答 2

6

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

这在T-SQL 的查询提示中进行了解释(总结) :

针对未知进行优化

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

于 2016-02-18T09:44:06.063 回答
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 ... 

正如这篇文章所解释的。将参数分配给局部变量会告诉 SQL Server 使用静态密度而不是静态直方图,从而避免参数嗅探问题。

于 2016-02-18T10:03:22.223 回答