最近一直在思考这个问题,网上关于这个问题的帖子很多,自己就常用的B*树索引专门做了个小测试。
SQL> conn / as sysdba
已连接。
SQL> create table t as select * from all_objects;
表已创建。
一、首先测试非唯一索引
SQL> create index idx_t on t(object_id,object_name);
索引已创建。
SQL> select header_file,header_block,blocks from dba_segments
2 where segment_name='IDX_T';
HEADER_FILE HEADER_BLOCK BLOCKS
----------- ------------ ----------
1 61825 384
SQL> alter system dump datafile 1 block min 61827 block max 61828;
系统已更改。
查看最新生成的用户跟踪日志TRC
Start dump data blocks tsn: 0 file#: 1 minblk 61827 maxblk 61828
buffer tsn: 0 rdba: 0x0040f183 (1/61827)
scn: 0x0000.0050a75f seq: 0x02 flg: 0x04 tail: 0xa75f0602
.............................................................................................................
row#148[4758] flag: ------, lock: 0, len=18
col 0; len 3; (3): c2 02 34
col 1; len 4; (4): 4c 4f 42 24
col 2; len 6; (6): 01 40 02 03 00 39
......................................................................................................
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 61827 maxblk 61828
二、首先测试唯一索引
SQL> drop index idx_t
2 ;
索引已删除。
SQL> create unique index idx_t on t(object_id,object_name);
索引已创建。
SQL> select header_file,header_block,blocks from dba_segments
2 where segment_name='IDX_T';
HEADER_FILE HEADER_BLOCK BLOCKS
----------- ------------ ----------
1 61825 384
SQL> alter system dump datafile 1 block 61830;
系统已更改。
查看最新生成的用户跟踪日志TRC
Start dump data blocks tsn: 0 file#: 1 minblk 61830 maxblk 61830
buffer tsn: 0 rdba: 0x0040f186 (1/61830)
...............................................................................................................
row#12[7621] flag: ------, lock: 0, len=38, data:(6): 00 40 f1 0b 00 15
col 0; len 3; (3): c2 09 10
col 1; len 25; (25):
.............................................................................................................
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 61830 maxblk 61830
总结:注意以上红色部分,它就是存的ROWID,但是在非唯一索引,ROWID作为单独的一列添加到索引键中,而唯一索引的ROWID则是存到data(6)中,由此也可以证明B*树索引中不存在非唯一条目。