所以我确定我的 SQL Server 的不稳定行为是因为 .Net SqlClient 数据提供程序的默认设置为SET ARITHABORT OFF
. 话虽如此,我已经阅读了各种讨论实现这一点的最佳方式的文章。对我来说,我只想要一个简单的方法,因为 SQL Server 正在受苦,而且我的查询调整还没有完全超越应用程序(显然SET
在 sp 中添加不起作用)。
在 Erland Sommarskog 关于该主题的精彩文章中,他基本上建议采取安全的方法,通过更改应用程序来发出SET ARITHABORT ON
连接。但是,在来自 dba.stackexchange question的这个答案中,Solomon Rutzky 提供了实例范围和数据库范围的方法。
在此实例范围内设置我在这里遗漏了什么后果?正如我所看到的......因为SSMS默认设置了这个,我认为为所有连接设置这个服务器范围ON
没有什么害处。ON
归根结底,我只需要这个 SQL Server 的执行高于一切。
存在一些默认值仅仅是因为没有人真正知道更改它们会产生什么影响。例如,在使用“美国英语”作为操作系统语言的系统上安装时,默认的实例级排序规则是
SQL_Latin1_General_CP1_CI_AS
. 这是没有意义的,因为SQL_*
排序规则是为了兼容 SQL Server 2000 之前的版本。从 SQL Server 2000 开始,您实际上可以选择 Windows 排序规则,因此美国英语系统的默认值应该更改为Latin1_General_CI_AS
. 但是,我想微软没有人真正知道这将对所有各种潜在的子系统和系统存储过程等产生什么影响。因此,我不知道将其设置为 ON 作为数据库默认值甚至是实例范围的任何特定负面影响。同时,我还没有测试过。但即使我已经对其进行了测试,我可能仍然不会使用与您的应用程序相同的代码路径,所以这是您真正需要在您的环境中测试的东西。将其设置为
ON
在您的开发和 QA 环境中的实例级别,看看它是如何工作的一两个月。然后在 Staging / UAT 中启用它。如果几周后一切顺利,请将配置更改转至生产环境。关键是要给尽可能多的时间来测试不是每天都命中的各种代码路径。有些每周或几个月或每年都会受到打击。某些代码路径仅受到支持,或者某些人多年前创建的临时报告或维护过程的影响,并且从未告诉过您,并且仅以随机间隔使用(不,这从未发生过;-)。所以,我对一个仍然具有默认“用户选项”设置的实例进行了一些测试,因为我从未更改过它。
请注意:
@@OPTIONS
/'user options'
是位掩码值ARITHABORT ON
设置
我使用 SQLCMD(使用 ODBC)和 LINQPad(使用 .NET SqlClient)进行了测试:
(the
^
是 DOS 行继续符;.
最后一行的 the 只是强制多行,以便于复制和粘贴)在 LINQPad 中:
测试 1:之前
SQLCMD 返回:
LINQPad 返回:
更改默认连接选项:
以下 T-SQL 启用
ARITHABORT
时无需删除可能设置的任何其他选项,并且如果ARITHABORT
已在位掩码值中设置,则无需更改任何内容。测试 2:之后
SQLCMD 返回:
LINQPad 返回:
结论
鉴于:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
,因此它们接受默认设置我建议更改实例范围的默认连接选项(如上所示)。这将比更新应用程序不那么突兀。如果您发现更改实例范围的设置有问题,我只会更新应用程序。
PS我做了一个简单的测试,改变
tempdb
而不改变实例范围的设置,它似乎没有用。