ARITHABORT OFF对性能产生不利影响

时间:2015-07-09 09:06:53

标签: sql-server sql-execution-plan arithabort

我完全清楚应用程序的SQL查询通常使用SET ARITHBAORT OFF,因为SSMS(默认情况下)使用SET ARITHBAORT ON。我还认为SET ARITHBAORT OFF仅用于遗留兼容性,并且真正的查询应该与SET ARITHBAORT ON一起运行。

我有一个查询作为C#Console App批处理文件的一部分运行。使用SET ARITHBAORT OFFSET 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选项无关紧要,为什么我的查询会锁定? 感谢。

http://www.sommarskog.se/query-plan-mysteries.html

2 个答案:

答案 0 :(得分:2)

行。因此,我从Sommarskog文章中提取的引用声明是在数据库级别为80或更高的条件下。

我在MSDN reference for ARITHABORT

中找到了这一段
  

将ANSI_WARNINGS设置为ON时隐式将ARITHABORT设置为ON   数据库兼容级别设置为90或更高。 如果是数据库   兼容级别设置为80或更早,ARITHABORT选项   必须明确设置为ON

这解释了:

  1. 即使ARITHABORT设置为ANSI_WARNINGS,为什么在更改ON时也会有所不同。 (数据库级别为80)
  2. 为什么更改数据库级别似乎解决了问题(因为我将其更改为120)

答案 1 :(得分:0)

您发布的文章具有误导性。如果ansi_warnings为ON并且arithabort已关闭,则人类知道这对您的查询没有任何影响。 sql server引擎不知道这是否会产生影响,并且会自动强制获取新的执行计划而不使用缓存的计划。这意味着如果你有参数嗅探问题并且计划不好,你将永远不会得到那个糟糕的计划并在arithabort上使用它。这使得该设置成为查找参数嗅探的一个很好的测试。使用optimize for unknown提示进行参数嗅探,而不是更改可能影响其他事物的数据库兼容性级别。