在稳定的应用程序中删除参照完整性

时间:2013-08-04 03:48:42

标签: sql database

我已经阅读了一些有些相关的问题,但没有找到与我的问题相关的细节。

如果我有一个不会改变的稳定应用程序并且已经过彻底测试并在野外使用...可能会考虑在数据库模式中删除参照完整性/外键约束,目的是改进性能

如果不讨论这样做的缺点,是否有人知道可能会有多少性能优势?有没有人这样做并且经历了显着的性能优势?

7 个答案:

答案 0 :(得分:3)

利益(无论多么微小)对利弊无关紧要。

如果性能有问题,请检查索引。以其方式投入更多硬件。有许多技术可以提高性能。

我知道你说不要提及缺点 - 但你应该考虑他们。数据是非常有价值的资产,并确保其有效性可以保持您的业务发展。如果数据无效,则修复它有一个很大的问题。

答案 1 :(得分:3)

根据我对Oracle的经验:

外键向优化器提供信息(“您将在此连接中找到一个匹配”),因此删除这些信息可能会导致执行计划中出现(不是那样)有趣的事情。

外键执行检查,这会降低性能。我已经看到那些在批处理上耗费了大量执行时间(在一天中大块运行的作业的小时数),导致我们使用延迟约束。

由于删除外键会改变语义(想想级联,认为应用程序依赖于无法删除被其他东西引用的主条目,至少在并发访问的情况下)我只会考虑这样的步骤当外键被证明在这个应用程序中占主导地位时。

答案 2 :(得分:2)

尝试在性能和有效性之间做出决定就像选择你宁愿生活的那只手臂。正如其他人所指出的,有更好的方法来解决性能问题(如索引优化,硬件,查询调优)。在任何设计良好的数据库系统中,降低参照完整性的性能影响应该是最小的。

答案 3 :(得分:1)

因应用程序而异。所以“多少”将是一个相对的术语。 插入或删除记录时会产生性能优势。

因此,如果您有大量的插入或删除操作需要花费时间,那么它可能有所帮助,但即使您的应用程序稳定,我也不会建议您放弃它,因为在将来的开发中这可能会导致重大问题。

答案 4 :(得分:1)

  

可以考虑删除数据库模式中的引用完整性/外键约束,目的是提高性能...... [有]任何人都知道可能会有多少性能优势

您没有向我们提供有关您的数据库架构或其使用方式的信息,因此我会保守并估计您的性能优势介于±∞%(给予或接受)之间。

从不必检查外键的角度来看,删除外键可以提高性能。

从查询计划生成不能信任它们的角度来看,删除外键会降低性能,并且如果它们受信任,则不能采用相同的快捷方式。有关SQL Server示例,请参阅Can you trust your constraints?

外键不仅仅具有性能影响(例如ON DELETE CASCADE)。因此,尝试删除它们以提高性能而不考虑您正在删除的功能最多是天真的。

答案 5 :(得分:1)

在这个决定(或者说可能是大多数/所有决定)中“仅谈及绩效收益而非弊端”的背景下,这不是一个公平的问题。既然没有缺点就没有专业人士,你需要知道两者的全部范围才能做出真正明智的决定。对于这个特殊问题,因为最多只有一个好处(我说“充其量”,因为性能增益不像大多数人想要的那样保证),那么我们几乎无法讨论是否我们不能谈论关于缺点(但我们至少可以从利益开始:)。

优点:

  • 性能:删除外键可以在DML语句(INSERT,UPDATE和DELETE)上获得性能提升,但是有多少具体取决于所讨论的表的大小,索引,使用模式(行更新的频率和可更新的任何FK字段;行插入和/或删除的频率等等。虽然最佳实践的一些问题可以说“几乎总是”具有性能增益,但对性能的任何影响与任何变更相关的只能通过测试来确定。关于与删除FK相关的典型性能提升,在您进入相对大量的行(如百万或更多)和批量操作之前,您不太可能看到这种情况。

缺点:

  • 性能:大多数人都不希望看到性能因移除FK而受到负面影响,但很可能会发生。我不确定所有RDBMS是如何工作的,但Microsoft SQL Server中的查询优化器使用FK(已启用和可信)的存在来缩短表之间的某些操作。没有正确定义的FK会阻止优化程序获得更多洞察力,有时会导致查询速度变慢。

  • 数据完整性:数据库的主要职责是确保数据完整性。性能是次要的(即使非常接近第二)。你永远不应该牺牲低优先级目标的主要目标,特别是因为性能提升可以通过其他方法实现,例如:索引,更多/更快的CPU,更多/更快的RAM等。一旦你的数据不好,你可能会无法纠正它。考虑到这一点:

    • 不要相信应用程序“稳定”或不会更改。除非软件已经过时且没有人有源代码进行更改,否则很可能会发生变化。
    • 不要相信你已经找到了代码中的所有错误,无论你认为它是如何“彻底测试”的。该应用程序现在可能看起来很稳定,但是谁会说以后不会发现问题。如果您的应用程序中有超过10行代码,那么它是100%无错误是值得怀疑的。
    • 即使应用程序代码没有更改,您能否保证不会针对数据库写入其他应用程序代码?如果这是离开您控制的软件(即不是SaaS),您是否可以阻止已安装它的任何人编写自己的自定义代码来添加他们想要的功能,而这些功能并未在您的应用中提供?它发生了。即使在SaaS公司中,其他部门也可能会尝试针对数据库编写工具(例如需要执行操作以帮助客户的支持人员)。任何考虑删除FK的人都可能没有设置权限/安全性来阻止这样的事情。
  • 修复/更新的能力:应用程序现在可能“稳定”,但公司通常会改变方向和决策。 FK就数据所依据的规则提供指导。即使现在没有发生数据完整性问题,如果有时候应用程序将添加新功能(或修复错误),没有定义FK将使得更有可能因为缺少“文档”而引入错误“这将由FK提供。

答案 6 :(得分:0)

参照完整性约束可能[在某些数据库中,而不是SQL Server]自动在这些FK上创建索引;在这些条款的查询中提供更好的性能。

这些索引通常帮助查询性能,从而大大提高了效率。它们还为优化器提供了额外的信息,从而实现了更好的查询计划。

如果性能是一个问题,我会在删除参照完整性之前看到许多其他内容(缓存,准备好的stmts,批量插入)。但是,如果你有大量的活跃索引&在插入速度方面达到了严重的限制,它可能被认为是最后的选择。