I have query that join two very big tables and ran explain plan on that it showing like this..
----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 31 | 7 (0)| 00:00:01 |
| 1 | PX COORDINATOR | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | | | | |
| 3 | NESTED LOOPS | | | | | |
| 4 | NESTED LOOPS | | 1 | 31 | 7 (0)| 00:00:01 |
| 5 | PX PARTITION HASH ALL | | 1 | 17 | 5 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID| Tab1 | 1 | 17 | 5 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | Tab1_PK | 1 | | 4 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | tab2_PK | 1 | | 1 (0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID | Tab2 | 1 | 14 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------
Query:
select t2.colC,t2,colD,t1.colX
from tab2 t2
join tab1 t1 on t2.colA=t1.colA
and t1.colB=2345
and t2.colC in (123,456,789);
TABLE ACCESS BY INDEX ROWID
是否意味着优化工具正在访问索引或扫描表中的rowid
以获取rowids
?
目前查询在几秒内完成。但是在计划中说它没有使用任何索引,两个表都有适当的索引。
答案 0 :(得分:15)
TABLE ACCESS BY INDEX ROWID
表示Oracle内核正在浏览索引,并且知道并非所有需要的信息都包含在索引中(所需的列不在此索引中)。因此,它将指针指向实际的表数据(rowid)并进行查找。
在这种情况下,使事情运行得更快的流行技巧包括(非唯一)索引中缺少列。它避免了以较大索引为代价的表中的一次查找。
答案 1 :(得分:0)
按INDEX ROWID表访问 - 我们应该知道两件事情
行的rowid指定包含该行的数据文件和数据块以及该块中行的位置。通过指定行来定位行是检索单行的最快方法,因为它指定了数据库中行的确切位置。
搜索索引对于Oracle来说是一个快速而有效的操作,当Oracle找到所需的值时,它还可以在其他表中查找记录的rowid。然后,如果在查询