ITPub博客

首页 > 数据库 > Oracle > 唯一索引和非唯一索引ROWID存储的区别

唯一索引和非唯一索引ROWID存储的区别

原创 Oracle 作者:passion_of_data 时间:2011-06-22 09:13:54 0 删除 编辑

最近一直在思考这个问题,网上关于这个问题的帖子很多,自己就常用的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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
DBA

注册时间:2011-06-20

  • 博文量
    53
  • 访问量
    308794