1. 首页
  2. IT资讯

索引存储小记

本文简单讨论非唯一性与唯一性B*TREE索引在存储上的差异,以及全局索引及本地索引在存储上的差异。

一、唯一性索引与非唯一性索引–建立表SQL> create table k1(id int);

Table created

SQL> create table k2(id int);

Table created

–建立索引 SQL> create index idx_k1 on k1(id);

Index created

SQL> create unique index idx_k1 on k2(id);

Index created

–插入数据SQL> insert into k1 values(1);

1 row inserted

SQL> insert into k2 values(1);

1 row inserted

SQL> commit;

Commit complete

–checkpoint,使数据刷新到硬盘上SQL> alter system checkpoint;

–查看索引位置SQL> select segment_name,file_id,block_id from dba_extents where segment_name in (‘IDX_K1′,’IDX_K2’);

SEGMENT_NAME FILE_ID BLOCK_ID——————————– ———- ———-IDX_K1 8 5457IDX_K2 8 5465

–dump索引block–一般来说,每一个segment的第一个block是segment header,它不存放用户数据,故我们一般从第二个block开始dump:SQL> alter system dump datafile 8 block 5458;

System altered

SQL> alter system dump datafile 8 block 5466;

System altered

==============================================================================普通索引IDX_K1:row#0[8024] flag: —–, lock: 2col 0; len 2; (2): c1 02 –这是ID列col 1; len 6; (6): 02 00 15 42 00 00 –这列是rowid,它以一个列的形式存在在索引结构中

–注意:不要以为上面是两列的组合索引,最后一列其实是rowid。(如果是两列的组合非唯一性索引,这里会显示有三列的信息)–实际上,非唯一性索引中,dump 索引块出来的信息的最后一列总是rowid。

唯一性索引IDX_K2:row#0[8025] flag: —–, lock: 2, data:(6): 02 00 15 4a 00 00^^^^^^^^^^^^^^^^^ 这是rowid,放在row header上 col 0; len 2; (2): c1 02 –这是索引当前键值

===============================================================================从上面结果可以看出,每一个非唯一性索引entry比唯一性索引多出rowid部分。

二、全局索引与本地索引

–创建表和索引SQL> CREATE TABLE PAR1(ID INT) PARTITION BY RANGE(ID)2 (PARTITION P1 VALUES LESS THAN(10))3 ;

Table created

SQL> CREATE TABLE PAR2(ID INT) PARTITION BY RANGE(ID)2 (PARTITION P1 VALUES LESS THAN(10))

Table created

SQL> CREATE TABLE PAR3(ID INT) PARTITION BY RANGE(ID)2 (PARTITION P1 VALUES LESS THAN(10))3 ;

Table created

SQL> CREATE UNIQUE INDEX GIDX_PAR1 ON PAR1(ID);

Index created

SQL> CREATE INDEX GIDX_PAR2 ON PAR2(ID);

Index created

SQL> CREATE INDEX LIDX_PAR3 ON PAR3(ID) LOCAL;

Index created

–插入数据SQL> INSERT INTO PAR1 VALUES(1);

1 row inserted

SQL> INSERT INTO PAR2 VALUES(1);

1 row inserted

SQL> INSERT INTO PAR3 VALUES(1);

1 row inserted

SQL> COMMIT;

Commit complete

–刷新数据到硬盘SQL> ALTER SYSTEM CHECKPOINT;

System altered

–索引的存储位置SQL> select segment_name,file_id,block_id from dba_extents where segment_name in (‘GIDX_PAR1′,’GIDX_PAR2′,’LIDX_PAR3’);

SEGMENT_NAME FILE_ID BLOCK_ID——————————– ———- ———-GIDX_PAR2 9 1553GIDX_PAR1 9 1561LIDX_PAR3 9 1577

–dump索引SQL> ALTER SYSTEM DUMP DATAFILE 9 BLOCK 1562;

System altered

SQL> ALTER SYSTEM DUMP DATAFILE 9 BLOCK 1554;

System altered

SQL> ALTER SYSTEM DUMP DATAFILE 9 BLOCK 1578;

System altered

=============================索引的存储情况==============================索引GIDX_PAR1:全局唯一性索引row#0[8021] flag: —–, lock: 2, data:(10): 00 00 1f 5a 02 00 15 82 00 00^^^^^^^^^^^^^^^^^^^^^^^^^^^^^rowid,注意长度是10col 0; len 2; (2): c1 02

索引GIDX_PAR2:全局非唯一性索引row#0[8020] flag: —–, lock: 2col 0; len 2; (2): c1 02col 1; len 10; (10): 00 00 1f 5c 02 40 06 0a 00 00^^^^^^^^^^^^^^^^^^^^^^^^^^^^^rowid,长度是10

索引LIDX_PAR3:本地索引row#0[8024] flag: —–, lock: 2col 0; len 2; (2): c1 02col 1; len 6; (6): 02 40 06 22 00 00^^^^^^^^^^^^^^^^^rowid,长度是6========================================================================

总结:1、非唯一性索引中,每一个index entry都包含有当前的键值及rowid两个部分。dump block显示的index entry信息中的最后一列就是rowid。2、唯一性索引中,index entry只包含当前的键值信息。rowid会在row header存放。3、普通索引每一个entry的长度是6个字节全局索引的每一个entry的长度是10个字节4、全局索引比普通索引每一个entry多存放了OBJECT_ID的信息。5、如果可以建立唯一性索引,就不要建普通索引。唯一性索引比一般索引占用空间要少。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63785/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:布吉卡,转转请注明出处:http://www.cxybcw.com/195609.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code