SQL Server 外键约束的好处

8
我们正在设计一个数据库,在其中需要考虑一些外键(FK)约束。但这不仅限于形式化的结构和规范化。只有在它提供任何性能或可扩展性优势时,我们才会采用它。
我一直在阅读一些有趣的文章并搜索实际的好处。以下是一些链接:

http://www.mssqltips.com/tip.asp?tip=1296

我想了解FK的好处(除了正式结构和著名的级联删除/更新)。
  • 默认情况下,FK不会自动创建索引,那么在为FK创建索引时有哪些考虑因素?
  • 如何处理可为空的字段,这些字段映射为外键-是否允许?
  • 除了索引,这是否有助于优化SQL Server中的查询执行计划?
我知道还有更多问题,但我希望专家能够回答。请指导我。
5个回答

10
  • 外键没有性能或可扩展性方面的好处。
  • 外键强制实施引用完整性。这可以通过在某人错误地尝试删除父表中的行时引发错误来提供实际效益。
  • 默认情况下,外键不会被索引。您应该对外键列进行索引,因为这样可以在您删除/更新父行时避免对子表进行表扫描。
  • 您可以使外键列可空,并插入 null 值。

我一直在处理几百万个记录的数据库。 在数据库和它的副本之间导入数据,然后在 Web 应用程序环境中使用该副本需要做很多事情。嗯,我知道保持 PK 索引会自动帮助加快数据访问速度。现在,从这次讨论中,我得出结论:如果我在 SQL 查询中使用 JOIN,则应该使用 FK 并对其进行索引,以使 JOIN 操作更高效。 - Hemant Tank
例如,我有一个名为OrgMaster的表(包含所有Org记录),然后我有一个BookingMaster表(包含所有Booking记录)。现在,OrgMaster.Id被引用为BookingMaster.OrgId。因此,我有一个用于OrgId-to-Id关系的FK,我应该为这两个表之间的任何JOIN操作“索引”它以获得更好的性能.. 我理解正确吗?以上所有内容 - 以额外的空间和时间开销为代价(在具有FK的表中插入记录时)。 - Hemant Tank
我想请您提供一个需要考虑的事项清单,例如:
  • 当表格增长到几百万条记录时,FK索引是否会占用太多空间/时间?
  • 在这种情况下,值得每次都使用FK索引吗?
  • 什么情况下不应该应用FK或对其进行索引,或者两者都不做(当然,我可以从应用程序中处理很多)?
  • 是否有其他棘手的方法来加速JOIN或其他耗时的查找?
- Hemant Tank

6
主要好处是,如果您有错误的客户端代码尝试执行某些错误操作,您的数据库不会出现不一致。外键是一种“约束”,因此您应该这样使用它们。
它们没有任何“功能”好处,不会优化任何内容。您仍然需要自己创建索引等。是的,在作为外键的列中可以有NULL值。

1
不仅仅是有漏洞的客户端代码。在快速修复时,"有漏洞的"用户和数据库管理员也会因为直接输入SQL更新命令而犯错误! - Thomas Padron-McCarthy

4

FK约束可以保持数据的一致性。这就是主要的好处。FK约束不会提供任何性能增益。

但是,除非您有意对数据库结构进行了反规范化,否则我建议您使用FK约束。主要原因是一致性。


3

我在网上阅读过至少一个例子,其中显示外键确实可以提高性能,因为优化器不必在跨表时进行额外的检查,因为它知道由于外键的存在,数据已经符合某些特定的条件。很抱歉我没有链接,但是该博客详细说明了查询计划的输出以证明这一点。


1

如前所述,它们是用于数据完整性的。任何性能“损失”都将被修复破损数据所需的时间完全抵消。

然而,可能会有间接的性能优势。

至少对于SQL Server来说,在FK中的列必须在每一侧具有相同的数据类型。如果没有FK,例如,您可能会有一个nvarchar父项和一个varchar子项。当您连接这两个表时,您将获得数据类型转换,这可能会影响性能。

示例:不同的varchar长度导致问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接