mysql bitmap位图索引_Oracle位图索引(Bitmap Index)

位图索引是一种特殊类型的索引,其组织形式类似B树,但叶子节点存储方式不同。位图索引适用于列值较少的情况,如性别列,因空间占用小,提高扫描效率。然而,频繁更新的列不适合使用位图索引,因为它在更新时会锁定多个索引条目,降低并发性。位图索引常见于数据仓库系统,而不适用于OLTP系统。
摘要由CSDN通过智能技术生成

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树。与B树索引的区别在于叶子节点里存放索引条目的方式不同。从前面我们知道,B树索引的叶子节点里,对于表里的每

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树。与B树索引的区别在于叶子节点里存放索引条目的方式不同。从前面我们知道,B树索引的叶子节点里,对于表里的每个数据行,如果被索引列的值不为空的,则会为该记录行在叶子节点里维护一个对应的索引条目。

而位图索引则不是这样,其叶子节点里存放的索引条目如下图所示。

假设某个表T里所有的记录在列C1上只具有三个值:01、02和03。在表T的C1列上创建位图索引以后,则叶子节点的内容如图9-14所示。可以看到,位图索引只有三个索引条目,也就是每个C1列的值对应一个索引条目。位图索引条目上还包含表里第一条记录所对应的ROWID以及最后一条记录所对应的ROWID。索引条目的最后一部分则是由多个bit位所组成的bitmap,每个bit位就对应一条记录。

位图索引的结构

当发出where c1=’01’这样的SQL语句时,oracle会去搜索01所在的索引条目,然后扫描该索引条目中的bitmap里所有的bit位。第一个bit位为1,则说明第一条记录上的C1值为01,于是返回第一条记录所在的ROWID(根据该索引条目里记录的start ROWID加上行号得到该记录所在的ROWID)。第二个bit位为0,则说明第二条记录上的C1值不为01,依此类推。另外,如果索引列为空,也会在位图索引里记录,也就是将对应的bit位设置为0即可。

如果索引列上不同值的个数比较少的时候,比如对于性别列(男或女)等,则使用位图索引会比较好,因为它对空间的占用非常少(因为都是用bit位来表示表里的数据行),从而在扫描索引的时候,扫描的索引块的个数也比较少。可以试想一下,如果在列的不同值非常多的列上,比如主键列上,创建位图索引,则产生的索引条目就等于表里记录的条数,同时每个索引条目里的bitmap里,只有一个1,其它都是0。这样还不如B树索引的效率高。

如果被索引的列经常被更新的话,则不适合使用位图索引。因为当更新位图所在的列时,由于要在不同的索引条目之间修改bit位,比如将第一条记录从01变为02,则必须将01所在的索引条目的第一个bit位改为0,再将02所在的索引条目的第一个bit位改为1。因此,在更新索引条目的过程中,会锁定位图索引里多个索引条目。也就是同时只能有一个用户能够更新表T,从而降低了并发性。

位图索引比较适合用在数据仓库系统里,不适合用在OLTP系统里。

SQL> create table t_bitmap_test as

2 select rownum as id,trunc(dbms_random.value(1,4)) as bitcol

3 from dba_objects where rownum<=20;

SQL> select * from t_bitmap_test;

ID BITCOL

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

1 3

2 2

3 1

4 3

5 3

6 1

7 1

8 2

9 3

10 2

11 3

12 1

13 1

14 3

15 2

16 2

17 3

18 2

19 1

20 3

SQL> connect hr/hr

已连接。

SQL> alter session set events '10608 trace name context forever, level 10';

会话已更改。

SQL> create bitmap index idx_t_bitmap_test on t_bitmap_test(bitcol);

索引已创建。

SQL> alter session set events '10608 trace name context off';

会话已更改。

SQL> select object_id from user_objects where object_name='IDX_T_BITMAP_TEST';

OBJECT_ID

----------

24499

SQL> alter session set events 'immediate trace name TREEDUMP level 24499';

会话已更改。

10608事件用来跟踪创建bitmap索引的过程。而TREEDUMP则用来转储索引的树状结构。打开转储出来的文件:

*** SESSION ID:(7.13) 2008-06-10 14:33:46.000

qerbiARwo: bitmap size is 8168

qerbiIPI default pctfree=10

qerbiIPI length=0

qerbiAllocate pfree=127 space=8168

qerbiStart first start

qerbiRop: rid=00c01ce4.0000, new=Y , key: (2): c1 04

qerbiCmpSz notfound pctfree=10

qerbiCmpSz adjblksize=7351 length=0

qerbiRop keysize=4 maxbm=3531

kdibcoinit(3116714): srid=00c01ce4.0000

qerbiRop: rid=00c01ce4.0001, new=Y , key: (2): c1 03

kdibcoinit(3116698): srid=00c01ce4.0001

qerbiRop: rid=00c01ce4.0002, new=Y , key: (2): c1 02

kdibcoinit(311661c): srid=00c01ce4.0002

qerbiRop: rid=00c01ce4.0003, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0004, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0005, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.0006, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.0007, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.0008, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0009, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.000a, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.000b, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.000c, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.000d, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.000e, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.000f, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.0010, new=N, key: (2): c1 04

qerbiRop: rid=00c01ce4.0011, new=N, key: (2): c1 03

qerbiRop: rid=00c01ce4.0012, new=N, key: (2): c1 02

qerbiRop: rid=00c01ce4.0013, new=N, key: (2): c1 04

kdibcoend(3116714): erid=00c01ce4.0017status=3

[1] [2] [3]

test.jsp?url=http%3A%2F%2Fwww.chinaitlab.com%2Fcms%2Fimages%2Flogo14.gif&refer=http%3A%2F%2Foracle.chinaitlab.com%2Finduction%2F805714.html

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值