且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ORALCE10G 位图索引探究

更新时间:2022-08-22 16:45:38

ORALCE10G 位图索引探究

1. 实验目的

    研究对oracle数据库位图索引进行DML操作的探究,加深理解位图索引的原理,指导实践中的应用。

2. 实验环境

操作系统平台

Linux MyOracle 2.6.9-78.EL #1 Wed Jul 9 15:27:01 EDT 2008 i686 i686 i386 GNU/Linux

数据库版本

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 Prod

实验执行人

王涛

指导人

徐戟,储学荣

创建时间

2014525日星期日 23:43

修改时间

2014527日星期日 18:11

3. 知识准备

位图索引主要针对大量相同值的列,具体概念就不再索引块的一个索引行中存储键值起止Rowid,以及这些键值的位置编码(位图编码),位置编码中的每一位表示键值对应的数据行的有无。一个块可能指向的是几十甚至成百上千行数据的位置。这种方式存储数据,相对于B*Tree索引,占用的空间非常小,创建和使用非常快。当根据键值查询时,可以根据起始Rowid和位图状态,快速定位数据。

位图索引的位图在索引块上存储形式:

Leaf block dump

===============

header address 213972084=0xcc0f474

kdxcolev 0

KDXCOLEV Flags = - - -

kdxcolok 0

kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y

kdxconco 4

kdxcosdc 1

kdxconro 2                     ---表示本索引块上索引位图的数量

kdxcofbo 40=0x28

kdxcofeo 7114=0x1bca

kdxcoavs 7916

kdxlespl 0

kdxlende 0

kdxlenxt 0=0x0

kdxleprv 4254997=0x40ed15

kdxledsz 0

kdxlebksz 8008                ----索引块的大小(8008bytes

/*下面为位图索引的结构,由4个字段组成

row#0[7982] flag: ------, lock: 0, len=26

col 0; len 2; (2):  c1 03                     ---存储位图的键值:2

col 1; len 6; (6):  00 00 00 00 00 00         ---索引rowid的起始地址

col 2; len 6; (6):  00 40 e8 e2 00 0f         ---索引rowid的结束地址

col 3; len 6; (6):  c3 83 b4 d2 bc 01         ---位图信息

row#1[7936] flag: ------, lock: 0, len=26

col 0; len 2; (2):  c1 06

col 1; len 6; (6):  00 00 00 00 00 00

col 2; len 6; (6):  00 40 ed 76 01 3f

col 3; len 6; (6):  c5 ed 87 d9 bc 01

----- end of leaf block dump -----

4. 实验步骤

4.1 位图索引属性验证

4.1.1  准备工作

创建表:CREATE TABLE BM_TMP(CODE CHAR(1));

创建位图索引:CREATE BITMAP INDEX IDX_BM_T ON BM_TMP (CODE);

4.1.2  验证1:每个键值生成一个位图,不同键值生成不同的位图?

具体步骤:

1.查找表BM_TMP对应的位图索引IDX_BM_T存储的位置:

SELECT FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS

FROM DBA_EXTENTS

WHERE SEGMENT_NAME='IDX_BM_T';

FILE_ID  EXTENT_ID   BLOCK_ID     BLOCKS

----------     ----------     ----------     ----------

1          0      60809          8

2).查看索引的存储情况:

alter system dump datafile 1 block 60810;

查看跟踪日志:

Branch block dump

=================

header address 213972036=0xcc0f444

……

kdxconro 1

……

row#0[8049] dba: 4255116=0x40ed8c

col 0; len 1; (1):  2a

col 1; TERM

----- end of branch block dump -----

 

3).插入数据:

  • 插入键值 a:

SQL> insert into bm_tmp values('a');

1 row created.

SQL> commit;

Commit complete.

 

SQL> alter system dump datafile 1 block 60810;

System altered.

查看跟踪日志:

Leaf block dump

===============

header address 213972060=0xcc0f45c

……

kdxconro 1

……

row#0[7988] flag: ------, lock: 2, len=25

col 0; len 1; (1):  61                           键值:小写字母aascii

col 1; len 6; (6):  00 00 00 00 00 00

col 2; len 6; (6):  00 40 ed 82 00 07

col 3; len 6; (6):  c0 a2 90 d9 bc 01              位图信息编码

 

  • 插入键值 b:

SQL> insert into bm_tmp values('b');

1 row created.

SQL> commit;

Commit complete.

 

SQL> alter system dump datafile 1 block 60810;

System altered.

查看跟踪日志:

Leaf block dump

===============

header address 213972060=0xcc0f45c

……

kdxconro 2

……

row#0[7988] flag: ------, lock: 0, len=25

col 0; len 1; (1):  61                       键值:小写字母aascii

col 1; len 6; (6):  00 00 00 00 00 00

col 2; len 6; (6):  00 40 ed 82 00 07

col 3; len 6; (6):  c0 a2 90 d9 bc 01

row#1[7944] flag: ------, lock: 2, len=25

col 0; len 1; (1):  62                       键值:小写字母bascii

col 1; len 6; (6):  00 00 00 00 00 00

col 2; len 6; (6):  00 40 ed 82 00 07

col 3; len 6; (6):  c1 a2 90 d9 bc 01

----- end of leaf block dump -----

小结:当表中插入ab两个不同键值时会分别生成两个键值对应的位图。

 

4.1.3  验证2:当插入有相同的键值记录会不会重新生成一个新的位图?

   插入键值a