唯一索引的索引键不保存rowid

tom的oracle 9i&10g编程艺术中这样一句话:在一个非唯一索引中,oracle会把rowid作为一个额外列加到键上,使索引键为唯一; 先按索引键排序,再按rowid升序排序;在一个唯一索引中,不会再加rowid到索引键上。

这个怎么理解呢?唯一索引的索引键不保存rowid,那怎么通过rowid查找数据表中某行的值呢。下面的内容是通过google搜索得来,来源:http://www.itpub.net/thread-1287023-1-1.html

下面是一个完整的用例,使用了数据DUMP技术。

SQL> conn / as sysdba
已连接。
SQL> create table t as select * from dba_objects;

表已创建。

SQL> create index t_idx on t(object_id);

索引已创建。

SQL> select t.header_file,t.header_block from dba_segments t
2 where t.segment_name='T';

HEADER_FILE HEADER_BLOCK
----------- ------------
1 58408

SQL> alter system dump datafile 1 block 58410;

系统已更改。

普通索引,内容如下:
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 00 40 e4 29 00 30

SQL> drop index t_idx;

索引已删除。

SQL> create unique index t_idx on t(object_id);

索引已创建。

SQL> select t.header_file,t.header_block from dba_segments t
2 where t.segment_name='T_IDX';

HEADER_FILE HEADER_BLOCK
----------- ------------
1 92136

SQL> alter system dump datafile 1 block 92138;

系统已更改。

SQL>

唯一索引,内容如下:
row#0[8025] flag: ------, lock: 0, len=11, data:(6): 00 40 e4 29 00 30
col 0; len 2; (2): c1 03

可以看出,在非唯一索引中,Oracle会增加一列,用于存放对应rowid,即索引列的最后,并按照这个顺序排序。对于唯一索引,是放入data(6)中,即row header中。不论怎样,rowid还是会被存储的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值