Sql server @@选项位掩码与禁用\u DEF\u CNST\u CHK

Sql server @@选项位掩码与禁用\u DEF\u CNST\u CHK,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,我们正在尝试诊断SQL Server 2008和SQL Server 2008 R2上的一些性能问题,这些问题是由代表用户缓存的错误查询计划引起的,但无法在SSMS中准确地再现它们,因为我们无法说服SQL Server匹配从sys.dm_exec_plan_属性返回的应用程序的set_options值255,阿卡@@选项 @@@OPTIONS位掩码记录在以下MSDN页面中: 根据上面的页面,以下SET语句的组合应产生@OPTIONS值255: SET DISABLE_DEF_CNST_CHK

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

@@@OPTIONS位掩码记录在以下MSDN页面中:

根据上面的页面,以下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
返回254而不是255

显然,当您在SQL Profiler中看到
EXEC sp_reset_Connection
时,连接池能够解决这个问题,因为我们的应用程序代码实际上没有更改任何设置选项。但我们当然不能从SSMS调用sp_重置_连接:

Msg 208,16级,状态9,程序sp_重置_连接,第1行

无效的对象名称“sp\U重置\U连接”


有没有办法让最后的禁用位发挥作用?要调整的替代选项名称或系统表?

我找到了一种方法,可以将DISABLE_DEF_CNST_CHK设置为ON,但我不建议在生产服务器上执行此操作

建立新连接时,SQL Server将@选项设置为sys.configurations视图中“用户选项”行中存储的值。该值默认为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中打开一个新连接,使用原始问题中描述的其他设置选项,最终使我们找到了@options 255。

所以您将其缩小到了计划范围,并确认了SSMS,应用程序使用了不同的计划?看起来是这样的。我猜警告是正确的,禁用CNST CHK不再有效。对我来说,这表明0x01已被其他影响计划生成的选项所取代。您是否检查了计划之间的差异?问题将是参数嗅探,而不是某个未用于任何用途的弃用选项。您只需要查看执行得很差的已编译计划,并从XML中获取要在SSM中重现的参数编译值。