在Join(Junction)表上在Oracle中创建索引

时间:2015-05-29 05:05:49

标签: sql oracle indexing

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

我有一个由2列组成的联接表:(aID,bID)

  • aID是表A的外键,bID是表B的外键

  • aID和bID一起是连接表的主键。

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

  1. 在(aID,bID)上创建唯一索引。
  2. 在(aID,bID)上创建唯一索引,并创建2个单独的索引 在aID和bID上。
  3. 为aID和bID创建单独的索引。
  4. 以上都不是(建议你自己的)。

1 个答案:

答案 0 :(得分:3)

<强> TL; DR

  • 您不需要(aID, bID)上的索引 - 由于它是主键,因此已添加唯一索引。
  • 如果bID上的孤立查询在您的使用中很常见,则您可能希望bId上有单独的索引,例如像WHERE bID = 123
  • 这样的过滤器
  • 仅在aID上考虑索引时可能会有轻微的优点(特别是如果bID不是狭义类型)。

但与所有索引一样,您需要知道如何编写和访问数据,以便优化所有数据库使用者的性能。

更多详情

  

我应该在(aID,bID)上创建一个唯一索引。

不,如果(aID, bID)上已有主键,则Oracle已经有unique index,因此此处的其他索引将是多余的。

  

我应该为aID和bID创建单独的索引。

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

钻进每个人:

  

aID?

可能不是。因为主键是(aid, bid),所以已经有一个以aID作为第一列的索引,虽然不像只有aid的索引一样密集。

  

bID?

可能,是的。虽然是唯一索引的一部分,bID是第二列,但如果您经常查询bID被隔离使用(即在没有{{1的查询时),则唯一索引不会有用也存在)。但是如果它不是与aID隔离使用,并且根据所有索引,如果bId具有低选择性(例如,{{1只有2个不同的值),则不要索引aID每个都有50%的分布)然后索引就没用了。

其他注意事项

索引需要深入了解您的数据库是如何被利用的 - 需要仔细考虑新指数,并且需要对现有指数进行冗余分析(它们是否被利用?是否有类似的指标就足够了?)和有效性(如何我对索引的查询要快得多吗?)。

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