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
二、回表(Table Access by Rowid) 回表是一种根据 ROWID 访问表的方式。ROWID 是 Oracle 数据库中每行记录的唯一标识。回表可以快速地访问表中的一行记录,效率高于全表扫描。 回表通常用于以下情况: * 查询...
TABLE ACCESS BY INDEX SCAN利用索引进行数据检索,通常比全表扫描更快。 ROWID是Oracle中的行标识符,它包含了数据在文件、块及行内的位置信息,允许快速访问特定行。ROWID在行的生命周期内保持不变,即使行被移动...
* OPTION:对 OPERATION 操作的补充,例如对一个表的操作,OPERATION 可能是 TABLE ACCESS,但 OPTION 可能为 by ROWID 或 FULL * OBJECT_OWNER:拥有该数据库对象的Schema 名或 Oracle 帐户名 * OBJECT_NAME:...
1. Oracle 访问数据的存取方法:全表扫描(Full Table Scans, FTS)、通过 ROWID 的表存取(Table Access by ROWID)、索引扫描(Index Scan)。 2. 索引扫描(Index Scan):索引唯一扫描(index unique scan)、...
二、通过 ROWID 的表存取(Table Access by ROWID) 通过 ROWID 的表存取是 Oracle 存取单行数据的最快方法。行的 ROWID 指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过 ROWID 来存取数据可以...
2. 通过 ROWID 的表存取(Table Access by ROWID 或 rowidlookup): 3. 索引扫描(Index Scan 或 index lookup):有四种类型的索引扫描: (1)索引唯一扫描(index unique scan): (2)索引范围扫描(index ...
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 ...
- **通过ROWID的表存取(Table Access by ROWID)**:直接根据ROWID获取特定行。 - **索引扫描(Index Scan)**:包括: - **索引唯一扫描(index unique scan)**:查找具有唯一值的索引项。 - **索引范围扫描...
- **通过ROWID的表存取(Table Access by ROWID)**:直接根据ROWID定位数据行,非常快速,但只适用于已知ROWID的查询。 - **索引扫描(Index Scan)**:包括**索引唯一扫描(index unique scan)**和**索引范围...
2. **通过ROWID访问表(Table access by ROWID)** ROWID是Oracle中标识表中每一行的唯一地址,它包含了数据文件、块号和行号信息。通过ROWID直接访问是最快速的单行数据读取方法,但仅适用于单块读,不适合大数据...
通过ROWID的表存取(Table Access by ROWID)是一种快速定位单行数据的方法。ROWID包含了数据在表中的精确位置信息,包括文件号、块号和行内偏移。通过已知的ROWID,Oracle可以直接跳转到目标数据块,无需扫描整个表...
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中的一个强大功能,它可以自动...
基于RowID的访问 (Table Access by RowID) - **定义**:基于RowID的访问是一种通过RowID快速定位到表中的特定行的访问方式。 - **触发条件**:当查询可以通过索引获取RowID后,再根据这些RowID访问表中具体的行。 ...
`TABLE ACCESS BY LOCAL INDEX ROWID`和`INDEX RANGE SCAN`进一步指明了数据库如何通过索引访问数据。 4. **Index Usage**: `INDEX ROWID`和`INDEX RANGE SCAN`说明查询利用了索引来加速数据检索,`INDEX UNIQUE ...
- **Table Access By Index Rowid**: 通过ROWID访问表中的数据,适用于有索引的场景。 #### 四、总结 通过了解如何查看和解读Oracle SQL执行计划,可以更有效地优化查询性能。无论是通过autotrace、SQL命令还是第...
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 ...
Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...