什么会导致参数嗅探一台计算机而不是另一台计算机?
Posted
技术标签:
【中文标题】什么会导致参数嗅探一台计算机而不是另一台计算机?【英文标题】:What would cause parameter sniffing one one computer and not another? 【发布时间】:2013-06-07 19:27:43 【问题描述】:我今天刚刚在 MSSQL 中遇到了参数嗅探,并使用 OPTION RECOMPILE 来加速一个查询,该查询需要 2.5 秒,而没有参数则需要 2.5 秒。在不同的开发人员机器上,他们可以在没有 OPTION RECOMPILE 的情况下运行完全相同的查询,并且运行速度非常快。
什么可能导致一台机器需要 OPTION RECOMPILE 而另一台不需要?
【问题讨论】:
可能也想在 dba 上问这个问题。 相同版本/SP/SR/补丁级别?相同的操作系统、硬件/驱动程序?相同的分贝大小?最新统计? ...等等... @Preet 你的意思是而不是。完全不鼓励交叉发布。 不同的机器是指两个不同的 SQL Server 实例还是连接到同一个服务器的两个不同的客户端? 【参考方案1】:假设您的意思是两台机器都连接到同一台服务器,那么可能存在设置差异导致两个连接之间不共享不适当的计划。
为了使连接重用以前缓存的计划,很多设置(计划缓存键)必须相同,包括 ANSI_NULLS
、ARITHABORT
、Language
、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
和 cursor_options
是位标志,包含各种选项 as documented here。在我的实验中,user_id
实际上是指schema_id(default_schema_name)
而不是principal_id
。
【讨论】:
两台机器都在使用 sql managament studio 并连接到同一个实例。 @chobo - 不同的登录?如果是这样,我首先怀疑的是不同的默认语言或不同的默认模式。但无论如何(当时)很容易通过找到不同计划的计划句柄并将其传递给sys.dm_exec_plan_attributes
以上是关于什么会导致参数嗅探一台计算机而不是另一台计算机?的主要内容,如果未能解决你的问题,请参考以下文章
Google表格API Java程序可在一台机器上运行,而不是另一台机器--401 Au