在 Oracle 中的连接(连接)上创建索引 Table

Creating indexes in Oracle on a Join (Junction) Table

很抱歉这个简单的问题,但我问过几个人并得到了不同的答案。

我有一个包含 2 列的联接 table:(aID,bID)

以下哪项是在连接上创建索引的更有效方法table?

  1. 在 (aID,bID) 上创建唯一索引。
  2. 在 (aID,bID) 上创建唯一索引并创建 2 个单独的索引 关于 aID 和 bID。
  3. 为 aID 和 bID 创建单独的索引。
  4. None 以上(建议您自己的)。

TL;DR

  • 您不需要 (aID, bID) 上的索引 - 因为它是主键,所以已经添加了唯一索引。
  • 如果 bId 上的孤立查询在您的使用中很常见,则您可能需要 bID 上的单独索引,例如像 WHERE bID = 123
  • 这样的过滤器
  • 仅在 aID 上考虑索引可能也有一点好处(特别是如果 bID 不是窄类型)。

但与所有索引一样,您需要了解数据的写入和访问方式,以便优化所有数据库使用者的性能。

更多详情

Should I create a unique index on (aID,bID).

不,如果 (aID, bID) 上已经有主键,Oracle 已经有主键 unique index,所以这里再多一个索引是多余的。

Should I Create separate indexes for aID and bID.

每个外键列(独立)都有一个 general rule of thumb to add an index,但是,在(非常)少数情况下,这可能是多余的或无效的,例如你永远不会被外键过滤,或者外键没有选择性。

所以深入每个:

aID ?

可能不会。因为主键是 (aid, bid),所以已经有一个以 aID 作为第一列的索引,尽管不如只有 aid 的索引那么密集。

bID ?

可能,是的。尽管唯一索引的一部分,bID 是第二列,因此如果您经常查询 bID 被单独使用(即在没有 [=14 的查询中),唯一索引将无济于事=] 也有)。但是,如果 bId 没有与 aID 分开使用,则不要索引 bId,并且根据所有索引,如果 bID 具有低选择性(例如,[=11 只有 2 个不同的值) =],每个都有 50% 的分布)那么索引就毫无价值。

其他注意事项

索引需要深入了解您的数据库是如何使用的 - 需要仔细考虑新索引,并且需要分析现有索引的冗余(它们是否被使用?是否有类似的索引可以满足需求?)和有效性(我对索引的查询速度有多快?)。

此外,是否添加更多或更少索引的决定也将取决于读取与写入的偏差——更多的索引会增加 I/O 和写入的磁盘开销,但这可能不是一个问题例如在每天重建一次的报告服务器上。