当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
如有错误,敬请指正,万分感谢