rowid in unique index and normal index


今天看到个帖子,关于索引中是否包含ROWID,做个DUMP跟踪下看,以下为详细的跟踪记录:

SQL> create table test as select rownum a ,'c' c from dual connect by level<101;
Table created


SQL> create index u_test on test(a);
Index created


SQL> select extent_id,file_id,block_id from dba_extents where segment_name='U_TEST';
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0 6 121


SQL> alter system dump datafile 6 block 121; --assm 自动段管理位图占3个块,跳3个块
System altered


SQL> alter system dump datafile 6 block 124;
System altered


以下部分跟踪记录:
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 02 ----------------索引键值
col 1; len 6; (6): 01 80 00 74 00 00 -----------------------rowid
row#1[8012] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 80 00 74 00 01
row#2[8000] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 04
col 1; len 6; (6): 01 80 00 74 00 02

对应普通索引,把rowid是当成数据存储在后面的,因为普通索引的一个索引键值可以对应多条记录.

如果把rowid存储在metadata部分的话,可能储存不完.


SQL> create unique index u_test on test(a);
Index created


SQL> select extent_id,file_id,block_id from dba_extents where segment_name='U_TEST';
EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0 6 121


SQL> alter system dump datafile 6 block 124;


以下部分跟踪记录:
row#0[8025] flag: ------, lock: 0, len=11, data:(6): 01 80 00 74 00 00
col 0; len 2; (2): c1 02
row#1[8014] flag: ------, lock: 0, len=11, data:(6): 01 80 00 74 00 01
col 0; len 2; (2): c1 03
row#2[8003] flag: ------, lock: 0, len=11, data:(6): 01 80 00 74 00 02
col 0; len 2; (2): c1 04
row#3[7992] flag: ------, lock: 0, len=11, data:(6): 01 80 00 74 00 03
如上所示:唯一索引包含ROWID 但是在leaf的 metadata 部分,因为唯一索引的键值只对应一个rowid.

posted @ 2014-03-20 03:28  princessd8251  阅读(152)  评论(0编辑  收藏  举报