外键是否会影响查询性能
正如我从this post了解到的,有些情况下外键可以提高查询性能。外键是否会影响查询性能
我听到相反的要求虽然,因为参照完整性检查,外键的确伤害了查询性能。在哪些条件下(如果有的话)是真的吗?
1)查询这个词似乎是误导性的。我对各种性能处罚感兴趣。
2)有没有人有任何关于对INSERT,DELETE或UPDATE语句的负面影响的实际数字(我知道它取决于特定的系统,但是任何一种真实世界的测量值得赞赏)?
我假设对于INSERT查询,约束(包括外键约束)会使性能有所下降。数据库必须检查,无论你告诉它插入什么东西,你的约束允许它插入。
对于SELECT查询,外键约束不应对性能进行任何更改。
由于刀片是几乎总是非常快,加时赛少量不会明显,除了在边缘的情况下。 (构建几个GB数据库,您可能希望禁用约束之后再重新启用,只要你确定数据还是不错的。)
外键会导致子表的插入(或一些更新)或从父表中删除需要更长的时间。但这是一件好事,因为这意味着它确保数据完整性仍然存在。没有理由跳过使用foriegn密钥,除非你不想有有用的数据。通常不会注意到很多不同之处,除非您有多个外键实现到同一个父表中,或者您在一个批次中插入或删除多个记录。此外,我注意到,用户在插入或删除时比在选择中更容忍几秒钟的额外秒数。用户也不容忍所有不可靠的数据,这是你没有外键约束的情况。
您需要将它们编入索引以提高所选查询的性能。
如果外键有这种影响,它会在INSERTS上。当创建/修改记录时,数据库会对外键进行参照检查,而不是SELECTed。
我相信指出后指出,将在FK字段的索引改进性能,不能简单地认为一个FK关系改善的性能。除非正在完成JOIN操作,否则表上FK的存在不应对SELECT查询产生任何影响,此时,FK字段上的FK关系AND索引将提高性能。
在大多数情况下,外键不会影响查询性能,强烈建议使用这些外键。通过帮助规范化,您将消除冗余数据,并且如果您通过添加底层索引(针对相应的外键)跟进,您的查询将会获得良好的性能。
外键可以帮助查询优化器获得给定查询的最佳查询计划。
当你更新你的数据时,外键检查是一个因素(这是一个单独的考虑因素 - 我假设你的关注点是查询 - 除非通过单词查询暗示两者)。
对于INSERT/UPDATE/DELETE,简短答案是“是”。数据库将需要检查参照完整性是否完好,并且允许创建/修改。或者在DELETE的情况下,可能会有一些级联。
对于SELECT,其实完全相反。外键具有秘密附加好处,可以向您显示您最有可能在哪里执行复杂JOIN并具有非常常用的字段。这使索引工作变得更加容易,并且几乎可以保证所有的FK字段都应该被索引。这使得SELECTs 更快。
是否需要参照完整性外键,则外键的存在应成为性能
基线,你不妨问,如果一辆车可以去,如果你不把座位更快 - 一个形成良好的汽车包括座位,就像一个形成良好的数据库包含外键
理论上,是的:数据写入需要验证约束。
在实践中,很少:除非经过测量和证明,否则您可以认为没有性能影响。绝大多数时候,出现因其他问题性能问题:
- 糟糕的架构设计(丢失的索引,坏簇索引的选择)
- 争(阻塞),再次由于恶劣的架构设计(表扫描保证锁冲突)
- 糟糕的查询设计
在一个精心设计的架构和良好的查询约束的成本将开始非常高吞吐量露面。发生这种情况时,有预防措施。
我的2c:从来没有牺牲一些难以捉摸的性能目标的正确性约束。在非常罕见的情况下,当约束确实存在问题时,有测量结果显示这种情况,正如俗话所说:如果您不得不问问花费多少钱,您买不起。如果你不得不问,限制是否会成为一个问题,你不能删除它们(没有违法意图)。
同意。性能对于数据库来说确实很重要,但它永远不应该胜过数据的完整性。有什么需要快速插入不可靠的数据? – HLGEM 2009-11-16 21:33:49
如果您正在实施参照完整性,那么影响FK字段的INSERT和UPDATE将会变慢。但是,通常不需要担心,尤其是当大量数据库读取80%/写入20%时。这也是值得付出的代价。
在外键上创建索引通常是有益的,但很明显,它取决于您正在运行的SELECT语句的多少。
通常,由于规范化(避免重复的数据和同步问题),您需要外键。归一化到3度,然后在分析真实世界的表现后,你可以考虑去标准化。
外键检查比大多数人认为需要更多的时间。使用Oracle 11g和带有两个外键的表进行的当前测试显示,插入大约800.000行的时间在启用外键时花费了60秒,而没有外键时花费了20秒。 (当然,外键列索引)
无论如何,我同意所有其他海报,完整性约束不是一种选择,但保持数据一致的唯一方法。但是,对于导入,尤其是在空表中,如果时间很关键,则可以选择在导入时禁用外键。
在涉及一组批量插入的情况下,可以为插入禁用外键,然后在插入后重新启用。有效性扫描将验证没有插入的值违反规则。如果有的话,他们可以单独处理 - 他们必须是两种方式。 – 2016-03-14 04:45:50
外键减慢了插入和更改,因为必须验证每个外键引用。外键可以不影响选择,也可以使其更快,具体取决于DBMS是否使用外键索引。
外键对删除有复杂的影响。如果你删除引用外键的东西,它不会影响任何东西,但是如果你删除的东西被另一行/表中的外键引用,那么它通常会导致问题。
外键会导致表创建和更改中的性能下降。
当然,这一切都假定外键验证正在使用中。
通过“查询”,你的意思是SELECT?因为我认为参照完整性检查只会影响性能方面的INSERT/UPDATE/DELETE。 – 2009-11-16 21:13:58