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