验证oracle决定使用索引时会使用ROWID来访问数据

来源:互联网 发布:淘宝女包店铺介绍 编辑:程序博客网 时间:2024/06/05 10:45

当oracle决定使用索引时会使用ROWID来访问数据,根据索引扫描到的每行ROWID,然后通过ROWID再匹配对应的数据行。注:(在索引中,除了存储每个索引值,还存储相应的ROWID)

如下实验:

1)首先我们通过走索引的方式访问表数据:

 
SQL> explain plan for select * from emp where empno=7698;
 
Explained
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2949544139
--------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |     1 |    87 |     2   (0)| 00:0
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    87 |     2   (0)| 00:0
|*  2 |   INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     1   (0)| 00:0
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("EMPNO"=7698)
 
14 rows selected

从红色标志来看,oracle根据索引扫描到了14行的ROWID(总共有14条记录),根据扫描到的每行ROWID,再找到表中的数据行。

2)其次我们直接访问ROWID的方式访问数据

SQL> explain plan for select * from emp where rowid='AAASZHAAEAAAACXAAF';
 
Explained
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1116584662
--------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     1 |    99 |     1   (0)| 00:00:0
|   1 |  TABLE ACCESS BY USER ROWID| EMP  |     1 |    99 |     1   (0)| 00:00:0
--------------------------------------------------------------------------------
 
8 rows selected

 

如有错误,敬请指正,万分感谢