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.