Oracle 提示具有多个连接语句的多个索引



我有一个查询如下:

SELECT /*+ INDEX(A T1_IX01) INDEX(A T1_IX02) INDEX(B T2_IX01) INDEX(C T2_IX01)*/
       *
FROM   T1 A
JOIN   T2 B
ON     A.SOURCE = B.C1
JOIN   T2 C
ON     A.TARGET = C.C1;

我需要使用我使用 SOURCE 列创建的 T1 中的 2 个索引,另一个使用 TARGET 列使用该列,该列的值与 T2 的 C1 也已映射。

在当前状态下,它只使用 T1 中的一个索引,该索引声明为第一个提示,而不是后面的提示。总而言之,我想使用在同一表上创建的两个不同索引进行两个单独的连接。

为什么以及如何解决此问题以获得更快的结果?

如@Boneist所述,让优化器完成工作。

此外,对于任何数据库,在大多数情况下,对同一个表使用 2 个索引是没有意义的。遍历一个索引后,您已经拥有表块的 ROWID。从此块中,您可以获取所有表列的值。因此,您无需遍历任何其他索引。

与其

有两个索引,不如创建一个包含多个列的索引。根据经验,按方差对索引中的列进行排序。将大多数选择性列放在前面。

显然,我已经提示优化器使用哈希连接而不是使用创建的索引,然后性能已经相当高。任何其他想法将不胜感激。

SELECT /*+ use_hash */
       *
FROM   T1 A
JOIN   T2 B
ON     A.SOURCE = B.C1
JOIN   T2 C
ON     A.TARGET = C.C1;

最新更新