使用多个联接语句对多个索引进行Oracle提示

tag5nh1u  于 2022-12-11  发布在  Oracle
关注(0)|答案(2)|浏览(111)

我有一个查询如下:

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;

我需要使用T1中的两个索引,我使用SOURCE列创建了这两个索引,另一个使用TARGET列创建了这两个索引,TARGET列的值与T2的C1(也进行了索引)Map。
在当前状态下,它只使用T1中的一个索引,该索引被声明为第一个提示,而不是后面的提示。总而言之,我希望使用在同一个表上创建的两个不同索引来进行两个单独的连接。
为什么我应该如何解决这个问题,以获得更快的结果?

ewm0tg9j

ewm0tg9j1#

显然,我已经提示优化器使用散列连接而不是使用创建的索引,这样性能就提高了很多。

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

eni9jsuy2#

正如@Boneist所说,让优化器来做这项工作。
对于任何数据库来说,对同一个表使用两个索引是没有意义的(在大多数情况下)。一旦你遍历了一个索引,你就已经有了表块的ROWID。从这个块你可以得到 * 所有 * 表的列的值。所以你不需要遍历任何其他索引。
创建一个包含多个列的索引,而不是两个索引。根据经验,按差异对索引中的列进行排序。将选择性最强的列放在前面。

相关问题