Sql server 2005 外键会影响查询性能吗

Sql server 2005 外键会影响查询性能吗,sql-server-2005,Sql Server 2005,正如我从中了解到的,有些情况下外键可以提高查询性能 不过,我听到了相反的说法,即由于引用完整性检查,外键实际上会影响查询性能。在什么情况下(如果有的话)这是真的 1) “查询”一词似乎有误导性。我对各种表现处罚感兴趣 2) 是否有人有任何关于INSERT、DELETE或UPDATE语句负面影响的真实数据(我知道这取决于具体的系统,但无论如何,任何类型的真实测量都是值得的)?我假设对于INSERT查询,约束(包括外键约束)会在一定程度上降低性能。数据库必须检查您告诉它插入的内容是否是您的约束允许

正如我从中了解到的,有些情况下外键可以提高查询性能

不过,我听到了相反的说法,即由于引用完整性检查,外键实际上会影响查询性能。在什么情况下(如果有的话)这是真的


1) “查询”一词似乎有误导性。我对各种表现处罚感兴趣


2) 是否有人有任何关于INSERT、DELETE或UPDATE语句负面影响的真实数据(我知道这取决于具体的系统,但无论如何,任何类型的真实测量都是值得的)?

我假设对于INSERT查询,约束(包括外键约束)会在一定程度上降低性能。数据库必须检查您告诉它插入的内容是否是您的约束允许它插入的内容

对于SELECT查询,外键约束不应对性能进行任何更改


由于插入速度几乎总是非常快,因此除了边缘情况外,少量的额外时间不会明显。(在构建一个数GB的数据库时,您可能希望禁用约束,然后在以后重新启用,只要您确定数据良好。)

外键可能会导致在子表中插入(或某些更新)或从父表中删除所需的时间更长。然而,这是一件好事,因为这意味着它确保了数据的完整性。除非您不想拥有有用的数据,否则没有任何理由跳过使用外键。除非有许多外键关联到同一个父表,或者在一个批处理中插入或删除许多记录,否则通常不会注意到太多的差异。此外,我注意到,用户在插入或删除操作中比在选择操作中更能容忍几秒钟的额外时间。用户也不能容忍任何不可靠的数据,而这些数据是没有外键约束的


您将需要对它们进行索引,以提高select查询的性能。

如果外键以这种方式产生任何影响,那么它将影响INSERT。当创建/修改记录而不是选择记录时,数据库对外键执行引用检查

我相信这篇著名的帖子指出,在FK字段上添加索引可以提高性能,而不仅仅是FK关系可以提高性能。表上存在FK不应对SELECT查询产生任何影响,除非正在执行联接操作,此时FK字段上的FK关系和索引将提高性能。

外键在大多数情况下不会影响查询性能,强烈建议使用。通过帮助标准化,您将消除冗余数据,如果您通过添加基础索引(针对适当的外键)来继续,您将在查询中获得良好的性能

外键可以帮助查询优化器获得给定查询的最佳查询计划


当您更新数据时,外键检查是一个因素(这是一个单独的考虑因素-我假设您关心的是查询-除非查询一词同时表示这两个方面)。

对于插入/更新/删除,简短的回答是“是”。数据库需要检查引用完整性是否完整,是否允许创建/修改。或者在DELETE的情况下,可能需要进行一些级联


对于选择,事实恰恰相反。外键还有一个秘密的额外好处,它可以精确地显示最有可能进行复杂连接的位置,并且具有非常常用的字段。这使得索引的工作更加容易,并且您几乎可以保证所有FK字段都应该被索引。这使得选择更快。

如果引用完整性需要外键,则外键的存在应构成性能基准


你可能会问,如果你不把座椅放进去,汽车是否能跑得更快——一辆结构良好的汽车包括座椅,就像一个结构良好的数据库包括外键一样。理论上,是的:数据写入需要验证约束

在实践中,很少有这样的情况:除非经过测量和证明,否则您可以假设没有性能影响。绝大多数性能问题是由其他问题引起的:

  • 架构设计错误(缺少索引,聚集索引选择错误)
  • 争用(阻塞),同样是由于错误的模式设计(表扫描保证锁冲突)
  • 糟糕的查询设计
在设计良好的模式和良好的查询上,约束的代价将开始以非常高的吞吐量显示出来。发生这种情况时,有预防措施


My 2c:从不为一些难以实现的性能目标牺牲正确性约束。在非常罕见的情况下,当约束确实是问题时,有测量结果表明情况确实如此,正如俗话所说:如果你不得不问它要花多少钱,你负担不起。如果您必须询问约束是否存在问题,则无法删除它们(无意冒犯)。

如果您强制执行引用完整性,则会影响FK字段的插入和更新速度会变慢。然而,通常不需要太担心,尤其是当许多数据库都是80%读/20%写的时候。这也是值得付出的代价

在外键上创建索引通常是有益的,尽管很明显,它在多大程度上取决于您运行的SELECT语句


通常,由于正常化(避免重复数据和同步问题),您需要外键。标准化到第三度,然后在分析真实世界的性能之后,你可以考虑去标准化。

< p>外键检查花费的时间比大多数人想象的要多。当前使用Oracle 11g和一个带有两个外键的表进行的测试表明,在启用外键的情况下,插入大约800.000行的时间需要60秒,但是