【问题标题】:Difference between Option(Optimize For Unknown) and option(Optimize for (@parameter Unknown))Option(Optimize For Unknown) 和 option(Optimize for (@parameter Unknown)) 之间的区别
【发布时间】:2021-12-27 17:24:02
【问题描述】:

我有两个存储过程。在其中一个过程中,代码使用以下提示: 选项(优化未知)。另一个存储过程使用此提示: 选项(优化(@id 未知)。@id 是传递给存储过程的参数。 这两个提示有什么区别?

【问题讨论】:

  • fine manual 中解释。 OPTIMIZE FOR UNKNOWNOPTIMIZE FOR (@x UNKNOWN) 对查询中所有变量的通用应用。顺便说一句,除非程序每秒执行多次,否则OPTION (RECOMPILE) 往往会产生更好的结果,因为可以针对特定值调整执行计划,但在某些情况下,即使这样也可能导致次优计划和UNKNOWN更好。
  • 非常感谢,杰伦!我有一个要求,我需要使用 xml 字符串传递多个值,而不是为 @id 传递一个值。在这种情况下,我该如何更改 Optimize For 提示,因为我的理解是它只接受一个值?
  • 为什么要使用 XML 字符串而不是 TVP?没有OPTIMIZE FOR 不能真正处理这两种情况。
  • 谢谢,亚伦! XML 字符串来自应用程序,因此我无法控制它。
  • 您仍然可以在服务器端粉碎 XML 并将其存储在表变量或临时表中。 OPTION (RECOMPILE) 使用该表的查询可能需要获得良好的性能(特别是如果您使用表变量,否则优化器将假定该表只有一行)。如果您使用临时表,优化器将有权访问统计信息。作为最后的手段,输入可用于动态构建查询。

标签: sql sql-server database tsql


【解决方案1】:

From the docs:(我的粗体字)

针对未知进行优化

指示查询优化器在编译和优化查询时使用谓词对所有列值的平均选择性,而不是使用运行时参数值。

如果您在相同的查询提示中使用OPTIMIZE FOR @variable_name = literal_constantOPTIMIZE FOR UNKNOWN,查询优化器将使用为特定值指定的literal_constant。查询优化器将使用UNKNOWN 作为其余的变量值。这些值仅在查询优化期间使用,而不是在查询执行期间使用。

所以OPTIMIZE FOR UNKNOWN 会将OPTIMIZE FOR @variable_name UNKNOWN 应用于尚未使用OPTIMIZE FOR 指定的每个变量

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 2011-05-20
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多