我今天刚刚遇到MSSQL中的参数嗅探,并使用OPTION RECOMPILE来加速查询,使用参数vs instant而不需要2.5秒。在不同的开发人员计算机上,他们可以在没有OPTION RECOMPILE的情况下运行完全相同的查询,并且运行得非常快。
什么可能导致一台机器需要OPTION RECOMPILE而另一台机器不需要?
答案 0 :(得分:9)
假设您的意思是两台计算机都连接到同一台服务器,那么可能存在设置差异导致不合适的计划在两个连接之间不共享。
为了使连接重用以前缓存的计划,相当多的设置(计划缓存密钥)必须相同,包括ANSI_NULLS
,ARITHABORT
,Language
,{{1}和默认模式(如果查询依赖于任何隐式名称解析)。
您可以通过查看DATEFIRST
(sys.dm_exec_plan_attributes
在连接之间需要相同的内容来查看这些内容)。
is_cache_key=1
is_cache_key=1
dbid_execute
required_cursor_options
compat_level
parent_plan_handle
date_format
language_id
status
merge_action_type
is_replication_specific
objectid
acceptable_cursor_options
date_first
set_options
user_id
dbid
optional_spid
optional_clr_trigger_objid
optional_clr_trigger_dbid
和set_options
是包含各种选项as documented here的位标志。在我的实验中cursor_options
实际上是指user_id
而不是schema_id(default_schema_name)
。