7
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

目前查询正在几秒钟内完成。但是在计划中说它不使用任何索引,两个表都有适当的索引。

4

2 回答 2

19

TABLE ACCESS BY INDEX ROWID意味着 Oracle 内核正在检查您的索引,并且知道并非所有需要的信息都包含在索引中(需要的列不在此索引中)。因此,它获取指向实际表数据(rowid)的指针并进行查找。

在这种情况下,使事情运行得更快的流行技巧是包括(非唯一)索引中的缺失列。它以更大的索引为代价避免在表中进行一次查找。

于 2014-02-01T13:44:05.113 回答
1

通过索引 ROWID 访问表 - 我们应该知道两件事

  1. 行的rowid 指定包含该行的数据文件和数据块以及该行在该块中的位置。通过指定行 ID 来定位行是检索单行的最快方法,因为它指定了该行在数据库中的确切位置。

  2. 搜索索引对 Oracle 来说是一种快速高效的操作,当 Oracle 找到它正在寻找的所需值时,它还可以在其他表中找到记录的 rowid。然后,如果在查询中请求,Oracle 可以使用此 rowid 获取更多信息

于 2017-07-04T21:56:23.003 回答