唯一索引和非唯一索引ROWID存储的区别[转帖]_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3870 | 回复: 0   主题: 唯一索引和非唯一索引ROWID存储的区别[转帖]        下一篇 
derek
注册用户
等级:中校
经验:1550
发帖:209
精华:0
注册:2011-7-21
状态:离线
发送短消息息给derek 加好友    发送短消息息给derek 发消息
发表于: IP:您无权察看 2011-8-3 16:38:25 | [全部帖] [楼主帖] 楼主

最近一直在思考这个问题,网上关于这个问题的帖子很多,自己就常用的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*树索引中不存在非唯一条目。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论