我完全清楚应用程序的SQL查询通常使用SET ARITHBAORT OFF
,因为SSMS(默认情况下)使用SET ARITHBAORT ON
。我还认为SET ARITHBAORT OFF
仅用于遗留兼容性,并且真正的查询应该与SET ARITHBAORT ON
一起运行。
我有一个查询作为C#Console App批处理文件的一部分运行。使用SET ARITHBAORT OFF
和SET ANSI_WARNINGS ON
准备(默认情况下)上下文。前92个调用执行正常,93rd总是锁定(每个调用使用不同的参数)。如果我在使用第93次调用中的参数调用存储过程之前使用SET ARITHBAORT OFF
,我已经能够在SSMS中重现这一点。
关于我的问题(抱歉目前为止的背景信息).... Erland Sommarskog article州:
接下来,当谈到ARITHABORT时,您应该知道在SQL 2005及更高版本中,只要ANSI_WARNINGS为ON,此设置就不会产生任何影响。因此,没有理由为此事打开它。
但是,我正在使用SQL Server 2014,我发现:
SET ARITHBAORT ON
SET ANSI_WARNINGS ON
EXEC mySP -- Runs efficiently
运行良好,但
SET ARITHBAORT OFF
SET ANSI_WARNINGS ON
EXEC mySP -- Runs indefinitely
无限期地运行。因此,如果SET ANSI_WARNINGS ON
使ARITHBAORT
选项无关紧要,为什么我的查询会锁定?
感谢。
答案 0 :(得分:2)
行。因此,我从Sommarskog文章中提取的引用声明是在数据库级别为80或更高的条件下。
我在MSDN reference for ARITHABORT
:
将ANSI_WARNINGS设置为ON时隐式将ARITHABORT设置为ON 数据库兼容级别设置为90或更高。 如果是数据库 兼容级别设置为80或更早,ARITHABORT选项 必须明确设置为ON 。
这解释了:
ARITHABORT
设置为ANSI_WARNINGS
,为什么在更改ON
时也会有所不同。 (数据库级别为80)答案 1 :(得分:0)
您发布的文章具有误导性。如果ansi_warnings为ON并且arithabort已关闭,则人类知道这对您的查询没有任何影响。 sql server引擎不知道这是否会产生影响,并且会自动强制获取新的执行计划而不使用缓存的计划。这意味着如果你有参数嗅探问题并且计划不好,你将永远不会得到那个糟糕的计划并在arithabort上使用它。这使得该设置成为查找参数嗅探的一个很好的测试。使用optimize for unknown提示进行参数嗅探,而不是更改可能影响其他事物的数据库兼容性级别。