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 |
实验执行人 |
王涛 |
指导人 |
徐戟,储学荣 |
创建时间 |
2014年5月25日星期日 23:43 |
修改时间 |
2014年5月27日星期日 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 键值:小写字母a的ascii
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 键值:小写字母a的ascii值
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 键值:小写字母b的ascii值
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 -----
小结:当表中插入a,b两个不同键值时会分别生成两个键值对应的位图。
4.1.3 验证2:当插入有相同的键值记录会不会重新生成一个新的位图?
插入键值’a