假设我有一个表,其中有许多字段链接到其他“值表”中的值。自然地,我对每个和每个都声明外键约束以强制完整性。
如果我最终得到 20-30 范围内的此类字段的数量怎么办?它会以某种方式“减慢”表操作吗?
添加:值表预计只有很少的记录,通常是 5-10 或其他东西。数据库是 SQL Server 2008。
假设我有一个表,其中有许多字段链接到其他“值表”中的值。自然地,我对每个和每个都声明外键约束以强制完整性。
如果我最终得到 20-30 范围内的此类字段的数量怎么办?它会以某种方式“减慢”表操作吗?
添加:值表预计只有很少的记录,通常是 5-10 或其他东西。数据库是 SQL Server 2008。
当您在子表中插入一行时,数据库引擎将查找父表中是否存在相应的值 - 这将占用一些 CPU 和一些逻辑读取。如果您的父表很小,它们很可能会在缓存中,因此一旦您的手杖变热,您就不会期望许多缓慢的物理读取。
我更关心的是,如果您要从父表中删除:如果您的子表上没有相应的索引,则整个子表将被锁定并扫描。另一方面,如果您的所有外键都有相应的索引,那么最终您的子表上可能会增加多达 20-30 个索引,这会大大降低速度。
您可能想运行自己的基准测试并亲自查看。
是的,在检查所有相关约束时,插入和更新会有一些性能损失,但除非您尝试以高速率插入数据,否则不太可能导致任何问题。正确维护数据通常比快速维护数据更重要,因此付出代价是值得的。
如果您对几列执行 UPDATE,则只需要检查这些列上的约束,并且大多数 DBMS 只会检查这些约束。
SELECT 语句当然不会减慢速度,在某些(可能很少见)情况下,甚至可以从优化器了解正在连接的 2 个表之间的外键关系中受益。
与零外键相比,拥有一个外键会减慢插入/更新操作 - 只是因为数据库必须检查外键值是否确实存在。拥有 30 个外键会比没有外键慢。
也就是说,它会慢多少取决于很多事情,包括您正在使用的值表/数据库引擎/索引/等的大小......并且在最佳情况下几乎可以忽略不计。
在 20-30 个字段中,有多少很少被使用?也许可以建立其他一些表。从编码的角度来看,必须更新两个表变得更加困难,但如果您可以在大多数情况下省略更新第二个表,则会加快速度。
我处理一个 3rd 方应用程序,该应用程序具有主表和相应的“自定义”表,我们可以在其中设置自己的字段。不幸的是,我们一直都在使用“自定义”字段,并且很少能够仅仅处理主表。
我认为这将取决于您的查询是否使用任何约束。如果您的查询由于约束而需要检查另一个表,那么您将看到性能下降。如果您的查询没有引用约束中的任何列,则性能影响可能可以忽略不计。
像大多数与数据库设计相关的东西一样,这“取决于”。如果您的应用程序执行大量插入、更新和删除操作,您将遇到性能问题。这可能是可以证明去规范化的情况,尤其是在“值”表没有改变的情况下。