我应该在应用程序的所有 SELECT 查询中设置 ARITHABORT ON

Posted

技术标签:

【中文标题】我应该在应用程序的所有 SELECT 查询中设置 ARITHABORT ON【英文标题】:Should i set ARITHABORT ON in all SELECT queries in an application 【发布时间】:2017-06-23 12:53:13 【问题描述】:

我在维护的一个 VB6(ADO/ODBC 到 SQL Server)应用程序中遇到了突然的性能下降问题,这似乎可以通过在一些 SELECT 查询之前添加 SET ARITHABORT ON 来解决。

问题是:在应用程序的每个选择查询中创建一个通用过程来设置 ARITHABORT ON 是否明智?这样做有什么危险?此设置是否会导致 SELECT 查询返回无效数据(尤其是如果它们包含聚合函数)而用户/开发人员没有注意到它?

更新:请记住,此应用程序在启用了合并复制的 SQL Server 2014 服务器上运行。

【问题讨论】:

【参考方案1】:

这表明您目前已关闭 ARITHABORT。这是一个非常糟糕的主意,微软甚至在BOL上添加了一个特定的警告:

“您应始终在登录会话中将 ARITHABORT 设置为 ON。将 ARITHABORT 设置为 OFF 会对查询优化产生负面影响,从而导致性能问题。”

“警告 SQL Server Management Studio 的默认 ARITHABORT 设置为 ON。将 ARITHABORT 设置为 OFF 的客户端应用程序可以接收不同的查询计划,从而难以解决性能不佳的查询。也就是说,相同的查询可以在 Management Studio 中快速执行,但应用程序运行缓慢。使用 Management Studio 对查询进行故障排除时,始终与客户端 ARITHABORT 设置匹配。"

所以,是的,我会将 ARITHABORT 设置为 ON,但从一开始就是这样。如果环境的其余部分被构建为期望 ARITHABORT OFF,我会非常犹豫改变这样一个基本的行为设置。

至于性能问题,您甚至不应该使用 ARITHABORT 设置来修复它。我首先会调查数据为什么会出现性能下降。一定有什么改变了,如果你发现了什么,你可以用一种不太基本的方式来纠正它。

【讨论】:

是的,应用程序中的默认值为OFF,直到最近才似乎对应用程序产生了严重影响。虽然您提供的链接包含重要信息,但它没有回答我的问题。这样的更改是否可能会导致应用程序出现意外结果(尤其是涉及复制时)? 我怀疑复制是这个问题的一个因素。这取决于应用程序的构建方式。软件中进行了哪些有效性检查,需要哪些响应。我预计会出现一些应用程序错误。我不太期待错误的结果,但这是可能的。

以上是关于我应该在应用程序的所有 SELECT 查询中设置 ARITHABORT ON的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 查询中设置差异

使用AJAX数据源时可以在Select2中设置查询字符串参数吗?

如何在模型 laravel 中设置固定位置查询

在命名查询的 ORDER BY 中设置参数

我应该在 Redis 中设置“常量”结果缓存的过期时间吗?

如何使用 JSON 在 select2 中设置 optgroup