【问题标题】:Does "TABLE ACCESS BY INDEX ROWID" means optimizer using index or table?“TABLE ACCESS BY INDEX ROWID”是否意味着优化器使用索引或表?
【发布时间】:2014-02-23 03:12:06
【问题描述】:
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

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

【问题讨论】:

标签: performance oracle11g sql-tuning


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 2018-07-25
      • 1970-01-01
      • 2014-08-15
      • 2015-06-21
      • 2022-09-23
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多