“使用INDEX ROWID表访问”是指使用索引还是表的优化器?

时间:2014-01-30 17:06:27

标签: performance oracle11g sql-tuning

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

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

2 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:0)

按INDEX ROWID表访问 - 我们应该知道两件事情

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

  2. 搜索索引对于Oracle来说是一个快速而有效的操作,当Oracle找到所需的值时,它还可以在其他表中查找记录的rowid。然后,如果在查询

  3. 中请求,Oracle可以使用此rowid获取更多信息