@@OPTIONS 位掩码与 DISABLE_DEF_CNST_CHK

@@OPTIONS bit mask versus DISABLE_DEF_CNST_CHK

我们正在尝试诊断 SQL Server 2008 和 SQL Server 2008 R2 上的一些性能问题,这些问题是由代表用户缓存但无法准确重现的错误查询计划引起的它们在 SSMS 中,因为我们无法说服 SQL 服务器匹配从 sys.dm_exec_plan_attributes 返回的应用程序的 set_options 值 255,又名。 @@OPTIONS.

@@OPTIONS 位掩码记录在以下 MSDN 页面中: Configure the user options Server Configuration Option

根据上页,以下 SET 语句组合应产生一个 @@OPTIONS 值 255:

SET DISABLE_DEF_CNST_CHK ON
SET IMPLICIT_TRANSACTIONS ON
SET CURSOR_CLOSE_ON_COMMIT ON
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET ANSI_NULLS ON
SET ARITHABORT ON
SET ARITHIGNORE ON
SET QUOTED_IDENTIFIER OFF
SET NOCOUNT OFF
SET ANSI_NULL_DFLT_ON OFF
SET ANSI_NULL_DFLT_OFF OFF
SET CONCAT_NULL_YIELDS_NULL OFF
SET NUMERIC_ROUNDABORT OFF
SET XACT_ABORT OFF

但是当你执行它时你会收到警告:

Line 1: The option 'DISABLE_DEF_CNST_CHK' is obsolete and has no effect.

PRINT @@OPTIONS returns 254 而不是 255。

很明显,当您在 SQL Profiler 中看到 EXEC sp_reset_connection 时,连接池能够解决这个问题,因为我们的应用程序代码的 none 实际上会更改任何 SET 选项。但是我们当然不能从 SSMS 调用 sp_reset_connection:

Msg 208, Level 16, State 9, Procedure sp_reset_connection, Line 1

Invalid object name 'sp_reset_connection'.

是否有技巧可以让最后 DISABLE_DEF_CNST_CHK 发挥作用?要调整的替代选项名称或系统 table?

好吧,我找到了一种方法来设置 DISABLE_DEF_CNST_CHK,但我建议在生产服务器上这样做...

建立新连接时SQL 服务器将@@OPTIONS 设置为针对sys.configurations 视图中'user options' 行存储的值。此值默认为 0。您可以检查配置和 运行 值:

select * from sys.configurations where name = 'user options'
-- or:
EXEC sp_configure 'user options'

作为具有 sysadmin 或 serveradmin 角色的用户,您可以更改未来连接的值:

EXEC sp_configure 'user options', 1
GO
RECONFIGURE
GO

请注意,更改此设置会影响 所有 以后与服务器的连接,这就是为什么我 不要 建议在生产服务器上这样做的原因.

更改此配置值后,然后在 SSMS 中打开一个新连接,使用原始问题中描述的其他 SET 选项最终将我们带到@@OPTIONS 255。