【发布时间】:2015-07-09 09:06:53
【问题描述】:
我完全知道来自应用程序的 SQL 查询通常使用 SET ARITHBAORT OFF,而 SSMS(默认情况下)使用 SET ARITHBAORT ON。我也相信SET ARITHBAORT OFF 只是为了与旧版兼容而存在,真正的查询应该使用SET ARITHBAORT ON 运行。
我有一个作为 C# 控制台应用批处理文件的一部分运行的查询。使用SET ARITHBAORT OFF 和SET ANSI_WARNINGS ON 准备上下文(默认情况下)。前 92 个调用执行良好,第 93 个调用总是锁定(每个调用使用不同的参数)。如果我在使用第 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 选项无关紧要,为什么我的查询会锁定?
谢谢。
【问题讨论】:
-
我不确定我是否遵循您的推理,因为在您的上一个示例中,您似乎也设置
ANSI_WARNINGSOFF,那么它有什么影响什么时候打开是无关紧要的。 -
抱歉,打错了。我会更正它,我在这两种情况下都保留
SET ANSI_WARNINGS ON。 -
好的。我刚刚发现了另一个影响我的查询的隐藏变量。虽然我运行的是 SQL Server 2014,但数据库处于“SQL Server 2008 (100)”兼容模式(根据我们的实时数据库)。当我将其切换到“SQL Server 2014 (120)”时,两个查询现在都以相同的时间顺序运行。那么文章中的语句是否也可以以 SQL Server 2005 之后的兼容性级别为条件?
-
@ChrisWalsh - 不同的缓存计划。参数嗅探。如果您在第 93 次调用时稍微更改查询的文本并使用
ARITHBAORT OFF运行它,您可能会发现它运行速度与生成一个对这些参数有益的新计划一样快。 -
关于更改兼容级别的影响,SQL 2014 包含一个新的查询优化器 - 但仅在兼容级别为 120 (msdn.microsoft.com/en-us/library/bb510680.aspx) 时使用。在 110 或以下,使用旧的 optimister。这或许可以解释您所看到的。
标签: sql-server sql-execution-plan arithabort