参数嗅探解决方案


8

我过去曾使用两种方法来解决参数嗅探问题:

1)使用WITH RECOMPILE
2)将参数值重新分配给局部变量,并使用这些值代替参数

据我了解,这两者的最终结果是相同的-创建并使用了针对当前查询/参数优化的新执行计划。

如果是这样,那么这两种方法之间是否存在任何区别,或者它们本质上是相同的?一个比另一个更好吗?

Answers:


3

如果可以预料到典型值,则在每次(重新)创建存储过程时都使用这些值。将基于这些值创建执行计划,并将其存储以备将来使用。我的大多数存储过程.sql文件都以EXEC具有合理值的命令结尾,正是出于这个目的(该命令并用于识别代码中的基本错误)。

当然,如果您的存储过程运行时间非常长,以至于您无法在生产时间内合理执行它,这将无济于事。请注意,这还不足以开始工作,它必须成功完成才能存储计划。


4
  1. WITH RECOMPILE

这有点大锤。它重新编译模块中的每个语句。OPTION (RECOMPILE)在对参数敏感的语句上使用是更有针对性的解决方案。

  1. 将参数值重新分配给局部变量,并使用这些值代替参数

这具有与OPTIMIZE FOR UNKNOWN基于平均值生成计划相同的效果。该计划不会在每次执行时重新编译。

有关更多信息,请参见我的文章“ 参数嗅探,嵌入和RECOMPILE选项”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.