索引都会包含rowid来定位到具体的位置,但是唯一索引不会用rowid来作为“索引键”的一部分
比如在列col1上建立非唯一索引,则其索引键是col1| rowid,这样索引键就唯一了,但唯一索引不会在列上加上rowid构成索引键
比如在列col1上建立非唯一索引,则其索引键是col1| rowid,这样索引键就唯一了,但唯一索引不会在列上加上rowid构成索引键
测试:
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)中
但是,不论怎样,rowid还是会被存储的
作者:linwaterbin 发表于2013-2-3 0:18:28 原文链接
阅读:112 评论:0 查看评论