深入理解Oracle索引(3):唯一索引和ROWID
2013-02-03 00:18
525 查看
索引都会包含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还是会被存储的
比如在列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还是会被存储的
相关文章推荐
- 深入理解Oracle索引(10):索引列字符类型统计信息的32位限制
- 深入理解Oracle索引(5):反向索引的定义、缺点和适用场景
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 深入理解Oracle索引(19):表被 delete 后、索引叶子块里 entry 条目的状态
- 深入理解Oracle索引(6):在实践中初步认识3大索引的使用场景
- 深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
- 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路
- 深入理解Oracle索引(25):一招鲜、吃遍天之单字段索引创建思路
- 深入理解Oracle索引(21):视图和小表是否应该加索引
- 深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 统计、案例-深入理解Oracle索引(10):索引列字符类型统计信息的32位限制-by小雨
- 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染
- 深入理解Oracle索引(20):外键是否应该加索引
- 深入理解Oracle索引(6):在实践中初步认识3大索引的使用场景
- 深入理解Oracle索引(23):6 种常见不走索引的原因分析
- 深入理解Oracle索引(22):索引和NULL 协同合作互惠共赢
- 深入理解Oracle索引(10):索引列字符类型统计信息的32位限制
- 深入理解Oracle索引(15):日期转换函数的格式参数大小写规则对函数索引的影响
- 深入理解Oracle索引(23):6 种常见不走索引的原因分析