相信很多朋友在rowid和index之间都会有些疑问,今天在warehouse大师的blog中看到一片简单扼要的文章,在这里跟大家共享一下,相信以下的说法可以解开不少开发人员的心结。
唯一index和非唯一index的index entry中尽管都存在rowid,但是其实有一点细微的差别,在唯一index中index_column就是index_column, 数据通过index_column排序;而在非唯一index中index_column其实是index_key+rowid,如果index_key相同,那么会使用rowid排序。
Data is returned in the ascending order of index columns. Multiple rows with identical values are sorted in ascending order by rowid.
--=======================================================
SQL> select /*+ index(a idx_tt) */ a.*,rowid from tt a where id<=2;
ID NAME AGE ROWID
---------- ---------- ---------- ------------------
1 a AAAD9yAAEAAAAAOAAA
1 a AAAD9yAAEAAAAAQAAC
2 a AAAD9yAAEAAAAAOAAB
2 a AAAD9yAAEAAAAAQAAD
执行计划
----------------------------------------------------------
Plan hash value: 6977672
--------------------------------------------------------------------------------
------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
------
| 0 | SELECT STATEMENT | | 2 | 12 | 5 (0)| 00:0
0:01 |
| 1 | [color=red]TABLE ACCESS BY INDEX ROWID[/color]| TT | 2 | 12 | 5 (0)| 00:0
0:01 |
|* 2 | INDEX RANGE SCAN | IDX_TT | 5 | | 1 (0)| 00:0
0:01 |
--------------------------------------------------------------------------------
------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ID"<=2)
统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size
695 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed
唯一index和非唯一index的index entry中尽管都存在rowid,但是其实有一点细微的差别,在唯一index中index_column就是index_column, 数据通过index_column排序;而在非唯一index中index_column其实是index_key+rowid,如果index_key相同,那么会使用rowid排序。
Data is returned in the ascending order of index columns. Multiple rows with identical values are sorted in ascending order by rowid.
--=======================================================
SQL> select /*+ index(a idx_tt) */ a.*,rowid from tt a where id<=2;
ID NAME AGE ROWID
---------- ---------- ---------- ------------------
1 a AAAD9yAAEAAAAAOAAA
1 a AAAD9yAAEAAAAAQAAC
2 a AAAD9yAAEAAAAAOAAB
2 a AAAD9yAAEAAAAAQAAD
执行计划
----------------------------------------------------------
Plan hash value: 6977672
--------------------------------------------------------------------------------
------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
------
| 0 | SELECT STATEMENT | | 2 | 12 | 5 (0)| 00:0
0:01 |
| 1 | [color=red]TABLE ACCESS BY INDEX ROWID[/color]| TT | 2 | 12 | 5 (0)| 00:0
0:01 |
|* 2 | INDEX RANGE SCAN | IDX_TT | 5 | | 1 (0)| 00:0
0:01 |
--------------------------------------------------------------------------------
------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ID"<=2)
统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size
695 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4 rows processed