• 位图索引


    有不少做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

  • 相关阅读:
    DB2 SQL1477N问题
    db2 查看表空间使用率
    DB2中的数据类型
    DB2锁机制
    DB2数据库常用命令数据库学习
    DB2 sql报错后查证原因与解决问题的方法
    F. Bakkar In The Army 二分
    On the way to the park Gym
    csu 1552: Friends 二分图 + Miller_Rabin
    Gym
  • 原文地址:https://www.cnblogs.com/zourui4271/p/6623585.html
Copyright © 2020-2023  润新知