《海量数据库解决方案》之位图索引的结构和特征
2.2.2 位图索引的结构和特征
位图索引的根块和分支块的结构与B-Tree索引完全相同,唯独叶块与B-Tree索引有所不同,其具体结构如图2-8所示。
■ 图2-8
假设表中的“COLOR”列值在每一个数据块中的存储顺序为“YELLOW,GREEN,RED,NULL”,如果基于这个列来创建位图索引,则需要将叶块中该列的各个值转化为位。如图2-8右侧上端所示,利用二维表来实现位图的转化,即表的行表示各个列值所对应的位,表的列表示各个行所对应的列值。
从图2-8中可以清楚地看到列值的位图转化方式。现在以该二维表中的行为单位来观察位图的具体转换方式,如图所示,只有列值与其所对应的行交叉时,位(Bit)才为1,其余均为0,例如,列值如果是“YELLOW”则结果为“1000”,列值如果是“RED”则结果为“0010”。这只是概念上的表现方式而已,实际上在查询满足查询条件的值时,从分支块出发只需要读取相应“COLOR”的叶块就可以了。如果由于OR的原因而需要读取两种颜色的叶块,则只需要按照同样的方法连续读取满足条件的两种颜色的叶块即可。
位存储时是按照“ROWID范围(Start ROWID~ End ROWID)”形式进行存储的,所以也可以认为它是一种压缩概念。通过使用键压缩(Key Compression)可以节省很多存储空间。另外,在存储列值时并不是直接对其进行存储,而是只有当出现有效值时才存储“1”,否则全部用“0”代替。
不仅如此,在执行数据查询时,由于它能够直接将满足所有查询条件的最终位转化为ROWID,所以它不像B-Tree索引那样每个索引行都有一个ROWID。尽管位图索引有其他索引所无法比拟的优势,但它也不是万能的,只有基于离散程度较低且相同值反复出现的列创建位图索引时,才能在很大程度上节约存储空间,例如,为具有1000万行数据的表创建位图索引可以确保其所占用的空间不超过10MB。
在基于离散度较差的列创建索引时,B-Tree索引为了提高索引的效率而需要将多个列结合在一起创建组合索引,而位图索引则不然。其之所以不用这么做主要是因为它支持集合运算,即从各个单独的位图索引中读取最终结果之后,再对其进行集合运算就可以获得与组合索引完全相同的效果。现在让我们来了解一下位图的集合运算。
如图2-9所示,在位的或运算中,1不论是与0还是与1进行运算,结果都是1,只有当两者都是0时结果才为0;而在与运算中,0不论是与1还是与0进行运算,结果都是0,只有当两者都是1时结果才为1。由于位运算结果其实也就是查询条件的合并,所以如果查找到了位运算的结果,也就意味着查找到了满足条件的数据行。由于位图索引支持位运算,所以就使得原来复杂的“OR”运算变得容易了很多。
■ 图2-9
从图2-8的右下侧可以观察到NULL值也被转化成了位。从位的角度来看,如果是NULL则为1,如果不是NULL则为0。由此可见,B-Tree无法解决的NULL问题,在位图索引中也得到了彻底解决。同样,即使有“NOT”存在,也只需要将位中的1变为0、0变为1即可,它的存在与否完全不会对位图索引的性能产生任何负面影响。
然而,当查询条件中使用的不是相等比较运算符“=”而是LIKE、BETWEEN、>、<、>=、<=等非相等比较运算符时,因为需要查询的位不仅不明确,而且查询的结果还是一个范围值,所以位图索引在此情况下就无法发挥其优势了。由于位是按照ROWID范围的形态进行存储的,如果基于修改频繁的列创建了位图索引,则不仅无形中会增加对索引空间的需求,而且还会由于块级锁(Block Level Locking)的原因而增加代价支出。还有就是,对于离散程度比较高的列而言,位图索引的优势也荡然无存。因此,位图索引在OLTP业务中很难被广泛使用。
由于这些限制条件的存在,使得位图索引主要只能被运用在数据仓库中。当然,在OLTP的统计或者汇总处理业务中位图索引也可以被灵活运用。另外,对于数据量比较少的代码表而言,在用户对其有着多样化的查询要求和频繁需要从该表中查询数据的情况下,在OLTP业务中使用位图索引虽然有着一定的负担,但勉强还是可以接受的。
在分区表中,只有在局部分区(Local)索引中才可以使用位图索引。
2.2.3 位图索引的读取
利用位图索引从表中读取数据时,首先分别读取满足单个查询条件的所有位,然后对其进行AND运算,最后筛选出满足条件的数据。如图2-10所示,“010010”就是运算后的最终位,然后将其转化为ROWID,最后使用该ROWID从表中读取对应的数据行。
■ 图2-10
下面是关于图2-10查询步骤的执行计划。
Execution Plan
0 SELECT STATEMENT
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'PARTS'
3 2 BITMAP CONVERSION (TO ROWID)
4 3 BITMAP AND
5 4 BITMAP INDEX (SINGLE VALUE) OF 'COLOR_BIX'
6 4 BITMAP INDEX (SINGLE VALUE) OF 'SIZE_BIX'
如该执行计划所示,从两个位图索引中读取了满足各自条件的位,通过AND运算筛选出了满足两个查询条件的位图,然后将这些位图转换为ROWID(BITMAP CONVERSION),最后根据该ROWID从表中读取对应的数据行,并对其进行排序。表2-1详细地介绍了该执行计划中的每一个单位操作。
如果把表2-1中所介绍的单位执行计划按照不同的方式进行排列组合,就可以得到多样化的执行计划。这里首先对一些基本类型予以详细说明。为了进一步正确地把握B-Tree索引与位图索引之间的差别,首先让我们来研究一下表2-1所列举的SQL语句。
表2-1 SQL语句
Option Det.option 说 明
BITMAP
CONVERSION TO ROWIDS 为了读取表中的数据而将位图转换为ROWID
FROM ROWIDS ROWID转换为位图
COUNT 不需要实际列值而只读取符合条件的ROWID的个数
BITMAP INDEX SINGLE VALUE 在索引块中与一个键值相对应的位图的查询
RANGE SCAN 与一个键值相对应的多个位图的查询
FULL SCAN 在没有提供开始/结束值的情况下位图整体扫描
BITMAP MERGE - 对范围扫描所获得的几个位图进行合并
BITMAP MINUS - 否定型运算或者集合差运算
BITMAP OR - 对于两个位图集合执行或运算
BITMAP AND - 对于两个位图集合执行与运算
BITMAP KEY
ITERATION - 对于从一个表中获得的行使用指定的位图索引进行连续扫描,直到找到符合条件的位图的操作,这是在星变形连接(Star Transformation)中所表现出来的类型
图2-11中描述的是在位图索引中使用了在B-Tree索引中所不能使用的由“NOT”所构成的查询条件,以及对其进行“OR”运算的情况。
从COL1的索引中读取123所对应的位图,从COL2的索引中读取ABC所对应的位图,然后对两者执行差集运算(BITMAP MINUS)。
从COL2的索引中读取列值为NULL的位图,然后再从的运算结果中减去COL2为NULL的位图。需要注意的是,在查询条件中使用某个列时,必须无条件地将所有的NULL值排除在外。因此为了满足条件COL2<>'ABC',就必须排除COL2为‘ABC’和NULL的值。
由于查询条件COL3<100要求执行范围扫描,所以在读取满足该查询条件的所有位图之后,将其合并(BITMAP MERGE)为一个位图。
对和所得到的结果进行OR运算(BITMAP OR),所得到的便是满足所有查询条件的最终位图,将该位图转换为ROWID,最后使用该ROWID读取表中的数据。
书名:海量数据库解决方案
作者:[韩]李华植 著
译者:郑保卫 盖国强 译
ISBN 978-7-121-11883-8
出版日期:2011年1月
定价:69.00元
开本:16开
页码:460 页
宣传语
涵盖数据库专家最新核心技术的RDBMS经典书籍
包含了将代码缩减为原来的1/10倍而速度提高至原来10倍的先进方法。
揭开了关系数据库的真面目,展示了截至目前为止未能被灵活使用的新技术。
内 容 简 介
本书将整体内容分为两部分,在第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的正确理解为基础,提出对执行计划和执行速度产生最大影响的索引构建战略方案;在第2部分中主要介绍提高数据读取效率的具体战略方案,在这部分中介绍与数据读取效率相关的局部范围扫描的原理和具体应用方法,以及对被认为是提高数据库使用效率基础的表连接的所有类型予以详细说明。
《海量数据库解决方案》系列丛书深受广大读者的喜爱已经长达10年之久,在被誉为“圣经”的同时,它已经变成了数据库用户不可或缺的必读书籍。作者竭力探求能够让IT工作者在实际工作中轻松应用并掌控的巧妙方法,提供事半功倍的海量数据库解决之道。
本书适合数据库开发人员和数据库管理员等阅读。