【问题标题】:Creating indexes in Oracle on a Join (Junction) Table在 Oracle 中为连接(连接)表创建索引
【发布时间】:2015-08-11 20:14:48
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 使用hadoop! (说真的,这是一个愚蠢的问题。太多的未知数。取决于你要对表格做什么)

标签: sql oracle indexing


【解决方案1】:

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, bid),所以已经有一个以aID 作为第一列的索引,尽管它不如仅aid 的索引那么密集。

出价?

可能,是的。尽管作为唯一索引的一部分,bID 是第二列,所以如果您有频繁的查询,其中bID 被单独使用(即在没有aID 的查询中也存在),唯一索引将无济于事.但是不要索引bId,如果它不是与aID 隔离使用,并且根据所有索引,如果bID 具有低选择性(例如,bID 只有两个不同的值,每个都有 50%分布)那么索引就没有价值了。

其他注意事项

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

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

【讨论】:

  • 在联结表上 - 使用复合唯一键而不是两个索引不是更好吗?这样我们有索引+没有重复?不确定复合索引是否会像两个独立的索引一样有效。
  • 这就是我在这个答案中试图说的,@WitoldKaczurba 因为复合主键(aID,bID)。 Oracle 会自动在这个复合键上创建一个具有唯一性的索引。同样的唯一索引也可以(相对)很好地单独用于列 aID 的查询。但是,如果单独对 bID 进行查询,例如WHERE bID = xxx 然后在 bID 上需要一个单独的二级索引,前提是在 bID 上具有足够的选择性以使其有意义。
  • 谢谢@StuartLC。赞成。 :)。
猜你喜欢
  • 2020-10-15
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2017-11-05
  • 2012-09-14
相关资源
最近更新 更多