【问题标题】:Does adding a foreign key to a table affect its insertion time?向表中添加外键会影响其插入时间吗?
【发布时间】:2019-03-01 12:41:55
【问题描述】:

假设每个添加到表的外键还添加了CHECK 约束,以确保插入到外键列中的值来自该键为主键的表中的值集。

这意味着具有更多外键的表将需要更长的时间来插入值。这是正确的吗?

我正在使用 Microsoft SQL Server 2014。

【问题讨论】:

  • CHECK 约束是一种单独的约束类型,与 FOREIGN KEY 约束无关。外键和其他约束的开销是数据完整性的代价。没有什么是免费的。
  • 谢谢。我确实知道它们是不同的,但我不知道我可以删除 CHECK 约束并且仍然有一个外键。我可以吗?
  • 您可以在同一列上同时具有检查和外键约束,但如果功能是多余的,您可以简单地删除检查约束。两者都会限制可能值的范围。检查约束将执行得更好,但需要修改代码以添加/删除值,而外键约束允许基于引用的表动态约束值,并允许在引用的表中存储其他属性,这些属性应该存储在单独的每个标准数据库模型规范化的表。

标签: sql sql-server database-design sql-server-2014


【解决方案1】:

是的。在表中插入或修改数据时会检查外键关系。

外键必须是主键或唯一键。这保证了索引可用于检查。

一般来说,在索引中查找值应该很快。比插入中发生的其他事情更快,例如为数据找到空闲页面并记录数据。

但是,验证外键会增加一些开销。

【讨论】:

  • 谢谢。还有一件事:如果我的几乎每张桌子都有大约 5 个外键,这是否正常/正常?再过 9 分钟,我才能将您的答案标记为正确答案。
  • @WaterCoolrv2 。 . .这看起来很多,但在一个表上有多个外键并不少见。例如,通常存在没有外键关系的引用表(或者如果您跟踪谁在表中插入行,则可能存在关系)。
  • 我想拥有这些字段,但我想避免成本。如果我知道我永远不会在其中插入错误的值,我是否可以删除 FK 并让它们没有 CHECK 约束?
  • @WaterCoolrv2 。 . . .我建议您正确定义数据模型。如果您发现性能是一个问题,请解决性能问题。检查值是否存在不太可能是您需要的性能提升——例如,表上的现有索引比检查外键值要昂贵得多。
【解决方案2】:

不要混淆外键和检查 - 有两种不同的约束类型。例如 check 接受 null 而外键不接受(例外:在 delete 设置 null fk 选项时)。

当在数据库集合中插入/更新行时,正在执行步骤,例如检查表、列、验证权限的存在。如果您有 fk 数据库引擎,则必须在向表中插入/更新数据之前验证约束 - 这是执行的附加步骤。

我从来没有遇到过 fk 痛苦地减慢数据库操作持续时间的情况。

【讨论】:

  • 谢谢。但我想要一个可以接受空值的外键。那我不应该把它当作外键吗?
  • 一般来说,省略 fk 不是一个好主意。我不知道 SQL Server 规范,但在 Oracle fk 中接受空值。你能验证一下这个臀部吗?
猜你喜欢
  • 2014-12-16
  • 1970-01-01
  • 2017-07-06
  • 2012-05-25
  • 2013-11-19
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多