《Oracle SQL优化基础》之位图索引(BitMap index)

浏览: 4249

有不少做BI的后台同事问我,位图索引是啥?啥时候用? 此篇仅作为一个扫盲篇,有不对的地方欢迎大神指正。

首先我们要搞明白位图索引是什么,与普通的B*树索引有什么区别呢?

顾名思义,首先他是个索引(废话!),其次是以位图的形式进行存储、计算的。

看个图,下面是我们常用的B*树索引结构(取自网络):

可以看得出,表中索引列的每行数据都会维护到索引树中(Null值除外)

再来看看我们的位图索引长什么样(取自网络):

位图索引中只维护distinct值,也就是说重复的值是不维护在树中,如下图中,一个表(19条数据)中索引列只有01、02、03,那么索引树中就只维护这三个值对应的索引条目,

条目中存储的是【Key + rowid_start + rowid_end + bitmap】

【Key + rowid_start + rowid_end + bitmap】

Key:值(16进制)

rowid_start :值对应的rowid起始位置

rowid_end :值对应的rowid结束位置

bitmap:对应的位图值

前三个比较好理解,key就是值,rowid说明了这个值在表中对应的哪些列而说明了范围

bitmap存储的一串0和1(不是攻和受啊喂!)

代表了表中该索引列的值是否为真,呃。。。举个例子

首先明确一点1和0代表的是真和假,1为真,0为假,1就说明此行等于该条目中的key,0就说明此行不等于

上图的索引列中只存在01、02、03这3个值,

拿03来说,他的索引条目中存的是【0001001010001100010】,代表的含义是【假假假真假假真假真假假假真真假假假真假】,

真就说明这一行是03,假就说明这一行不是03(可能是01,可能是02)

如果上面那些理解了就好办了,我们来看下 位图索引 的意义在哪里:

如表A如下,为了避免歧义,假设字段中一共3个值:男;女;妖,共9条记录:

A:

姓名张三李四王五赵六小明小王 小红小丽小帅哥
性别男女男男妖男女妖男
入学时间200920092010201020102009201020092009

我们在性别入学时间上分别建立了位图索引:

所以在【性别】的索引树上会有3个条目:男;女;妖

男的bit位为:1 0 1 1 0 1 0 0 1

女的bit位为:0 1 0 0 0 0 1 0 0

妖的bit位为:0 0 0 0 1 0 0 1 0

而【入学时间】的索引树上会有2个条目:2009;2010

2009的bit位为:1 1 0 0 0 1 0 1 1

2010的bit位为:0 0 1 1 1 0 1 0 0

那么在做如下查询的时候,位图索引的处理过程是如何的呢?

select t.name from A t

where t.gender = '男' and t.date = 2010

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

男的bit位为:    1 0 1 1 0 1 0 0 1

2010的bit位为:0 0 1 1 1 0 1 0 0

and操作则会对这两租0和1进行操作(or则是操作)

result:            0 0 1 1 0 0 0 0 0

所以根据结果来看只有第3行和第4行满足where条件,也就是说最后查出的【Name】就是王五和赵六。

总结:

Clipboard Image.png

推荐 9
本文由 老头子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

研究研究~

要回复文章请先登录注册