你能告诉我OPTION (USE HINT('DISABLE_PARAMETER_SNIFFING'))和OPTION (OPTIMIZE FOR UNKNOWN)有什么区别吗?
发布于 2020-06-17 11:20:09
查询提示上的文档表示
DISABLE_PARAMETER_SNIFFING ...等于跟踪标志4136。
这个跟踪标志被记录在KB980653中,它告诉我们
启用跟踪标志4136将禁用参数嗅探,这相当于向引用参数的每个查询添加对未知提示的优化。
关于支持的跟踪标志的文档显示大约4136
..。要在数据库级别完成这一任务,请参阅ALTER作用域配置中的PARAMETER_SNIFFING选项以在查询级别完成相同的结果,添加对未知查询提示的优化。对未知提示的优化不会禁用参数嗅探机制,但有效地绕过它以获得相同的预期结果。。。在查询级别完成此操作的第二个选项是添加使用提示'DISABLE_PARAMETER_SNIFFING‘查询提示,而不是使用此跟踪标志。
在我看来,这些都是一个单一的特性,封装在几个语法公式中,适用于不同的粒度。它可以应用于实例、数据库、会话、存储过程、查询或该查询中的单个参数。他们都在做同样的事情,只是用不同的语言来实现它。此意见得到步骤的支持,以便在解决用于优化和禁用的嗅探问题时应用。反过来。
从不透明的跟踪标志到对开发人员友好的透明提示通常可以解释其中的一些重复。我发现“禁用嗅探”比“未知优化”更容易推理。
我想我们可能永远不知道内部是否存在任何实际的代码路径差异,除非有源代码访问权限的人碰巧对回答感兴趣。实际上,我不相信会有。
我查看了为非常简单的查询生成的计划。
DBCC TRACEON(3604);
dbcc freeproccache;
declare @c int = 1;
select * from dbo.Skewed where c = @c
OPTION (QUERYTRACEON 8605, USE HINT('DISABLE_PARAMETER_SNIFFING'));
-- OPTION (QUERYTRACEON 8605, OPTIMIZE FOR UNKNOWN);这两个提示的查询计划是无法区分的。实际执行计划和绑定树(跟踪标志8605)都是相同的。
发布于 2023-03-07 10:30:04
对于大多数意图和目的,它们是不同的方式来实现相同的事情。
当还指定RECOMPILE查询提示时,有一个不同之处:
OPTIMIZE FOR UNKNOWN在准备执行计划时不使用特定的参数值。DISABLE_PARAMETER_SNIFFING允许RECOMPILE查看参数值,并将其嵌入查询中以代替参数。见使用提示并禁用_参数_嗅探,由Dmitry (从俄文翻译所需)。
https://dba.stackexchange.com/questions/206926
复制相似问题