改用ARITHABORT ON的风险


12

我正在与一家供应商合作,安排他们提供核心应用程序,只要不修改核心应用程序,我就可以构建自己的扩展。它内置在ColdFusion中,可连接到SQL Server 2005数据库。

我构建的某些报告依赖于使用从核心表计算出的函数的视图,并且随着表的增大,报告变得非常慢。为了加快报告速度,我想使用索引视图。但是,在我的测试环境中创建了索引视图之后,核心应用程序无法再插入到核心表中(它返回了一条错误消息,这ARITHABORTON使用索引视图时所必需的)。

因此,似乎为了使用索引视图,SET ARITHABORT ON每当插入/更新核心表时,我都需要拥有核心应用程序。我在测试环境中运行了此命令:

ALTER DATABASE MyDatabase SET ARITHABORT ON;

而且似乎工作正常。但是我的供应商说,由于应用程序具有成千上万的查询,因此该设置可能会中断其中一个查询,并且如果将来出现一些意外的数据库问题,他们会坚持要求我恢复默认设置。

是否有实际的查询会被打破SET ARITHABORT ON?在任何情况下都最好保留它OFF

TL; DR为了使新的索引视图生效,我需要ARITHABORT ON为整个数据库进行设置,但是我的供应商警告说,这将由我自己承担风险。实际上有风险吗?

Answers:


9

因此,SET ARITHABORT ON 基本上说 “如果发生除以零的错误或发生算术上溢,则中止查询”,这通常是理想的行为,并且是默认的实例范围设置。如果这导致您的供应商的查询出现问题,我想说他们可能从一开始就受到一些编码问题的困扰。我想请他们提供更多有关他们为什么在这里关注的细节。

索引视图的所有规则中,我将其称为,许多set选项规则中争议最少的规则。

这必须在与视图交互的连接中进行设置。因此,您可能想与供应商合作,并真正尝试理解他们的推理,并尝试使他们致力于他们在此处存在的巨大分歧时所考虑的事情。

话虽这么说-索引视图有点大。它们还有其他规则,它们可能会影响应用程序以及供应商开发人员在进行构建和性能测试时所采用的假设。实际上,您应该与他们就要通过索引视图解决的业务问题进行对话,并让他们参与有关如何解决问题的对话。


7

进行此更改的明显风险是,以前正确运行的供应商查询可能会引发错误或返回错误的结果。该ARITHABORT设置部分控制着算术溢出零除错误是否返回NULL结果,是否错误终止语句或是否以错误终止批处理。供应商代码如何对引发错误而不返回的代码做出反应,这不是NULL您要在生产系统上尝试的事情:)

但是,如果您的数据库兼容性级别为90或更高,并且会话使用进行运行,则风险较低SET ANSI_WARNINGS ONON测试索引视图时必须已经有此设置,但是您需要确认供应商应用程序连接所使用的有效设置SET在连接时,可以将Management Studio配置为使用与供应商代码设置的选项不同的选项(并且不能使用数据库或实例默认值覆盖这些选项)。请与供应商联系,并使用SQL Server Profiler跟踪供应商代码进行确认。

可以说,更大的风险是在将设置返回到之前,供应商将拒绝支持您的安装OFF,但您仍应尝试鼓励供应商更新其代码以使用推荐的SET选项,因此您不必在性能并运行支持的安装。当然,另一种方法是针对数据库副本运行报告。

-- Recommended effective settings
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT, 
    CONCAT_NULL_YIELDS_NULL, 
    QUOTED_IDENTIFIER, 
    ANSI_NULLS, 
    ANSI_PADDING,
    ANSI_WARNINGS ON;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.