SQL Server 2016 - 参数嗅探关闭 - 仍然看到重新编译提高性能的地方

1 sql-server-2016

我们使用的是 SQL Server 2016 并关闭了参数嗅探,因为它有时会导致严重的性能问题。我看到一些存储过程在 30 秒内运行,当它们重新编译时,它们在 2 秒内运行。这似乎与我们在参数嗅探中看到的行为非常相似。任何想法为什么这仍然发生?

账单

For*_*est 5

根据此链接,在 2016 年关闭参数嗅探选项等效于设置跟踪标志 4136。您应该阅读该跟踪标志。

来自该跟踪标志链接的特别重要的信息:

启用跟踪标志 4136...相当于添加一个 OPTIMIZE FOR UNKNOWN 提示

即使设置了跟踪标志,满足以下任何条件的查询仍会进行参数嗅探。

  • 该参数是通过使用“优化 (@p = )”查询提示来指定的。
  • 查询使用“选项(重新编译)”查询提示。
  • 该查询是使用“with recompile”选项的存储过程的一部分。

因此,通过添加重新编译,您告诉优化器根据传递的任何参数构建计划,但不要重用该计划。通过关闭参数嗅探(并且没有重新编译),计划是基于参数的统计信息构建的,并且将被重用,即使是对于否则会生成不同(可能更好)计划的值。