什么会导致参数嗅探一台计算机而不是另一台计算机?

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_NULLSARITHABORTLanguageDATEFIRST 和默认架构(如果查询依赖于任何隐式名称解析)。

您可以通过查看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_optionscursor_options 是位标志,包含各种选项 as documented here。在我的实验中,user_id 实际上是指schema_id(default_schema_name) 而不是principal_id

【讨论】:

两台机器都在使用 sql managament studio 并连接到同一个实例。 @chobo - 不同的登录?如果是这样,我首先怀疑的是不同的默认语言或不同的默认模式。但无论如何(当时)很容易通过找到不同计划的计划句柄并将其传递给sys.dm_exec_plan_attributes

以上是关于什么会导致参数嗅探一台计算机而不是另一台计算机?的主要内容,如果未能解决你的问题,请参考以下文章

另一台计算机上的实时服务器 vscode

如何防止嗅探器的探测?

Google表格API Java程序可在一台机器上运行,而不是另一台机器--401 Au

如何让另一台电脑的任务管理器运行程序

如何使用 Python SFTP/Paramiko 将 zip 文件从一台服务器传输到另一台服务器

为啥 Spring 在一台机器上而不是另一台机器上出现循环依赖问题?