【问题标题】:Recommended way to create composite index in Oracle在 Oracle 中创建复合索引的推荐方法
【发布时间】:2019-08-12 00:37:03
【问题描述】:

我有一个这样的 oracle 查询结构:

SELECT <SOME_COLUMNS>
FROM A a
JOIN B b ON a.A_ID = b.A_ID
JOIN C c ON b.B_ID = c.B_ID

忽略 WHERE 子句。

已经在 A_ID、B_ID 和 C_ID 上创建了单列索引(C_ID 未使用,但它是表 C 中的主键)。

对于上述查询,从这两种方法中创建其他索引的最佳方法是什么?

方法01

  • 为 b.A_ID(外键)创建单个索引
  • 为 c.B_ID(外键)创建单一索引

方法02

  • 为 a.A_ID 和 b.A_ID 创建复合索引
  • 为 b.B_ID 和 c.B_ID 创建复合索引

希望这对其他人也有帮助。

【问题讨论】:

  • WHERE 子句是索引定义的键。如果没有WHERE,你就不需要索引,因为hash join 很可能会被执行。

标签: oracle oracle11g oracle10g database-indexes


【解决方案1】:

您可以仅在单个表中创建复合索引

如你所愿:

为 a.A_ID 和 b.A_ID 创建复合索引
为 b.B_ID 和 c.B_ID 创建复合索引

这是不可能的。

在您的情况下,列 a.A_ID、b.A_ID、c.A_ID 上的单列索引就可以了。

【讨论】:

  • 如果多列用于连接,如JOIN B b ON a.A_ID = b.A_ID AND b.XYZ = '123' jist 单列索引就足够了,还是我必须为b.A_IDb.XYZ 创建复合索引?
  • 如果您的大多数查询往往总是在 WHERE 子句中使用两列来连接或过滤,那么是的,创建复合索引是有意义的。否则,这不是一个好主意。
【解决方案2】:

在这两种方法中,它将是 01。

方法 02 无论如何都行不通;您不能创建包含来自两个表(ab)的列的索引。

此外,根据您使用的数据库版本,外键列应该被索引,否则可能会发生锁定(您会想知道发生了什么 - 缺少索引)。 p>

【讨论】:

  • 如果多列用于连接,如JOIN B b ON a.A_ID = b.A_ID AND b.XYZ = '123' jist 单列索引就够了,还是必须为b.A_IDb.XYZ 创建复合索引?
  • 如果你创建一个复合索引,优化器会同时使用它们,甚至只使用前导列。您最好的选择是尝试一下;检查解释计划,看看如果在单独的列上有索引,或者如果有复合索引会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 2011-12-08
  • 2020-11-12
  • 1970-01-01
  • 2013-02-01
  • 2016-06-09
相关资源
最近更新 更多