`

回表 table access by index rowid

 
阅读更多
111

回表:在数据中,当查询数据的时候,在索引中查找索引后,获得该行的rowid,根据rowid再查询表中数据,就是回表。

 

 

 

--创建一个表, 索引只建立在object_id上

 

SQL> create table ml_1 as

  2  select * from dba_objects

  3  ;

 

Table created

 

SQL> create index idx_ml_1 on ml_1 (object_id);

 

Index created

 

--当select语句只有object_id时, 就不存在回表,因为索引包含此列。

unicomidmp@UNICOM>select object_id from ml_1 where  object_id =46;

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 328998971

 

-----------------------------------------------------------------------------

| Id  | Operation | Name     | Rows  | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------

|   0 | SELECT STATEMENT |    |  1 | 13 |  1   (0)| 00:00:01 |

|*  1 |  INDEX RANGE SCAN| IDX_ML_1 |  1 | 13 |  1   (0)| 00:00:01 |

-----------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 - access("OBJECT_ID"=46)

 

Note

-----

   - dynamic sampling used for this statement (level=2)

 

 

Statistics

----------------------------------------------------------

  7  recursive calls

  0  db block gets

69  consistent gets

  0  physical reads

  0  redo size

527  bytes sent via SQL*Net to client

524  bytes received via SQL*Net from client

  2  SQL*Net roundtrips to/from client

  0  sorts (memory)

  0  sorts (disk)

  1  rows processed

 

 

--当select不仅仅有object_id列,还有其他列, 这时就需要回表。

 

unicomidmp@UNICOM>select status,object_id from ml_1 where  object_id =46;

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 1099796311

 

----------------------------------------------------------------------------------------

| Id  | Operation    | Name     | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT    |       |     1 |    18 |     2 (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| ML_1     |     1 |    18 |     2 (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN    | IDX_ML_1 |     1 |       |     1 (0)| 00:00:01 |

----------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   2 - access("OBJECT_ID"=46)

 

Note

-----

   - dynamic sampling used for this statement (level=2)

 

 

Statistics

----------------------------------------------------------

11  recursive calls

  0  db block gets

72  consistent gets

  0  physical reads

  0  redo size

601  bytes sent via SQL*Net to client

524  bytes received via SQL*Net from client

  2  SQL*Net roundtrips to/from client

  0  sorts (memory)

  0  sorts (disk)

  1  rows processed

 

 

--所以并不是每次查询,都要走索引才是最优。

 

 

 

结论: 

 

如果在obiect_id上建立索引,那么在执行该条SQL语句时,先进行索引扫描,在索引中找到 obiect_id=46 所在的位置(一般只需要扫描3个块数据即可)

,获得该行的ROWID,根据其ROWID再查询数据(回表),如果所查找的数据量较少,则回表次数就少。如上面的例子,

要查询的数据只有 obiect_id在索引中,status并不在索引中,那么就要回表一次查询status,如果status也在索引中,那么就不需要回表。

如果索引查询的数据量大, 那么回表的次数就多, 索引扫描的io块+回表的io >  全表扫描io  ,此时就不能用索引。  即 no_index(x);

 

 

--------------------- 

作者:老农民挖数据 

来源:CSDN 

原文:https://blog.csdn.net/shushugood/article/details/51475825?utm_source=copy 

版权声明:本文为博主原创文章,转载请附上博文链接!

分享到:
评论

相关推荐

    sql学习 08.TABLE ACCESS BY INDEX ROWID.sql

    sql学习 08.TABLE ACCESS BY INDEX ROWID.sql

    个人整理,oracle访问路径(全表扫描、回表、索引范围扫描等等)

    二、回表(Table Access by Rowid) 回表是一种根据 ROWID 访问表的方式。ROWID 是 Oracle 数据库中每行记录的唯一标识。回表可以快速地访问表中的一行记录,效率高于全表扫描。 回表通常用于以下情况: * 查询...

    一文看懂Oracle的执行计划.doc

    TABLE ACCESS BY INDEX SCAN利用索引进行数据检索,通常比全表扫描更快。 ROWID是Oracle中的行标识符,它包含了数据在文件、块及行内的位置信息,允许快速访问特定行。ROWID在行的生命周期内保持不变,即使行被移动...

    plan_table学习笔记

    * OPTION:对 OPERATION 操作的补充,例如对一个表的操作,OPERATION 可能是 TABLE ACCESS,但 OPTION 可能为 by ROWID 或 FULL * OBJECT_OWNER:拥有该数据库对象的Schema 名或 Oracle 帐户名 * OBJECT_NAME:...

    ORACLE执行计划和SQL调优知识概述.pptx

    1. Oracle 访问数据的存取方法:全表扫描(Full Table Scans, FTS)、通过 ROWID 的表存取(Table Access by ROWID)、索引扫描(Index Scan)。 2. 索引扫描(Index Scan):索引唯一扫描(index unique scan)、...

    Oracle 表的扫描方式及连接方法

    二、通过 ROWID 的表存取(Table Access by ROWID) 通过 ROWID 的表存取是 Oracle 存取单行数据的最快方法。行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过 ROWID 来存取数据可以...

    oracle执行计划详解

    2. 通过 ROWID 的表存取(Table Access by ROWID 或 rowidlookup): 3. 索引扫描(Index Scan 或 index lookup):有四种类型的索引扫描: (1)索引唯一扫描(index unique scan): (2)索引范围扫描(index ...

    Oracle中explain_plan的用法

    3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) Statistics ---------------------------------------------------------- 0 recursive calls 2 db block gets 30 ...

    ORACLE执行计划和SQL调优.pptx

    - **通过ROWID的表存取(Table Access by ROWID)**:直接根据ROWID获取特定行。 - **索引扫描(Index Scan)**:包括: - **索引唯一扫描(index unique scan)**:查找具有唯一值的索引项。 - **索引范围扫描...

    ORACLE执行计划和SQL调优

    - **通过ROWID的表存取(Table Access by ROWID)**:直接根据ROWID定位数据行,非常快速,但只适用于已知ROWID的查询。 - **索引扫描(Index Scan)**:包括**索引唯一扫描(index unique scan)**和**索引范围...

    基本索引原理PPT学习教案.pptx

    2. **通过ROWID访问表(Table access by ROWID)** ROWID是Oracle中标识表中每一行的唯一地址,它包含了数据文件、块号和行号信息。通过ROWID直接访问是最快速的单行数据读取方法,但仅适用于单块读,不适合大数据...

    通过分析SQL语句的执行计划优化SQL(七)

    通过ROWID的表存取(Table Access by ROWID)是一种快速定位单行数据的方法。ROWID包含了数据在表中的精确位置信息,包括文件号、块号和行内偏移。通过已知的ROWID,Oracle可以直接跳转到目标数据块,无需扫描整个表...

    SQL 优化教程

    1 TABLE ACCESS BY INDEX ROWID CLASSES 2 AND-EQUAL 3 INDEX RANGE SCAN STAT_INDEX 4 INDEX RANGE SCAN LOC_INDEX ``` #### 四、使用SQL*Plus的AUTOTRACE工具 AUTOTRACE是SQL*Plus中的一个强大功能,它可以自动...

    Oracle SQL的优化.txt

    基于RowID的访问 (Table Access by RowID) - **定义**:基于RowID的访问是一种通过RowID快速定位到表中的特定行的访问方式。 - **触发条件**:当查询可以通过索引获取RowID后,再根据这些RowID访问表中具体的行。 ...

    将近1300行的sql执行计划

    `TABLE ACCESS BY LOCAL INDEX ROWID`和`INDEX RANGE SCAN`进一步指明了数据库如何通过索引访问数据。 4. **Index Usage**: `INDEX ROWID`和`INDEX RANGE SCAN`说明查询利用了索引来加速数据检索,`INDEX UNIQUE ...

    Oracle查看SQL执行计划SQL性能分析.docx

    - **Table Access By Index Rowid**: 通过ROWID访问表中的数据,适用于有索引的场景。 #### 四、总结 通过了解如何查看和解读Oracle SQL执行计划,可以更有效地优化查询性能。无论是通过autotrace、SQL命令还是第...

    oracle怎么查看执行计划

    3 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) Statistics ---------------------------------------------------------- 0 recursive calls 4 db block ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

Global site tag (gtag.js) - Google Analytics