唯一索引和非唯一索引ROWID儲存的區別

passion_of_data發表於2011-06-22

最近一直在思考這個問題,網上關於這個問題的帖子很多,自己就常用的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*樹索引中不存在非唯一條目。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25964700/viewspace-700453/,如需轉載,請註明出處,否則將追究法律責任。

相關文章