外键索引有何帮助?

sta*_*ked 6 index oracle foreign-key

外键索引有何帮助?保持外键索引的标准是什么?

JNK*_*JNK 8

这不是特定于 oracle 的,但通常外键索引最有用,因为它们可以加速JOINs。

如果您有一个外键字段,那么您极有可能也将其用作JOIN键 - 这就是 FK 的全部意义,tableatableb.

将此字段编入索引将加快在WHERE过滤器或JOIN条件中使用该字段的任何查询。


Mar*_*ith 8

除了 JOIN 之外,索引外键列的另一个好处是它可以加快对某些 DML 操作的外键约束的执行。

如果您从Orders表中删除一行,则 RDBMS 将需要确保这不会在OrderDetails. 显然,如果可以使用索引进行验证,这会更容易。


a_h*_*ame 7

通常,您应该索引所有外键,因为它们有助于减少父表上更新或删除期间的锁定。如果您仍在运行 Oracle 10.x,则尤其如此,在 11.x 中,情况变得更好一些。

简而言之,如果您在外键上缺少索引并且对父表的 PK 执行 UPDATE 或 DELETE 父表中的行,则 Oracle 将需要对子表进行全表扫描以确保PK 不在那里使用。

概念手册

如果外键没有被索引,那么子表可能会更频繁地被锁定,会发生死锁,并发度会降低。出于这个原因,外键应该几乎总是被索引。唯一的例外是匹配的唯一键或主键从未更新或删除。

当然,索引不仅会阻止该锁定,还会加速该检查,正如 Martin Smith 已经说过的那样。

最后,Tom Kyte 的以下引述可能会有所帮助:

那么,什么时候不需要索引外键呢?答案是,一般来说,当满足以下条件时:

  • 您不会从父表中删除。
  • 您不会更新父表的唯一/主键值(注意工具对主键的意外更新!)。
  • 您不会从父级加入到子级(如 DEPT 到 EMP)。