bit-wise索引原理(2012/7/3)

1 IQ 简介

SybaseIQ是一款数据仓储产品。个人认为其核心技术包括:列存储和bit-wise索引。首先了解行存储,把属于一行的所有列的数据存储在连续的空间即为行存储。行存储有两个缺点:由于DBMS中磁盘IO的单位是block (oracle中的block大小2K-32K), 如果查询只关心行中的部分列,需要同时读取其它的列,增加了IO;block上的数据类型不一致使得压缩率低。这两个缺点对数据仓储而言是非常大的限制。列存储很好的解决了这两个问题。

位图索引在数据存储中是一个非常有用的索引,相比B+树索引而言,位图索引占用的空间极少,且非常适合集合运算,比如count函数。位图索引的缺点是只适用于基数小的列,当列的基数变大以后,位图索引占用的空间非常大。位图索引的另一个缺点是不支持范围查找。

IQ声称其采用的bit-wise索引解决了位图索引的缺陷,bit-wise索引支持高基数列,且支持范围查找。Sybase为bit-wise技术申请了专利,其专利内容参见《METHOD AND APPARATUSFOR IDNEXING DATABASE COLUMNS WITH BIT VECTORS》,这篇专利论文详细的描述了bit-wise的技术细节。研究这篇论文后,下面是我对bit-wise的理解。

2 bit-wise原理

如图1所示,表存在两个列AA和BB。我们现在要在AA上建bit-wise索引。

 

AA

BB

row1

3

row2

1

row3

2

row4

4

row5

1

图1 table1中的数据

2.1 生成索引

●计算bit vector的数量

针对AA列,我们用32bit整数(实际上只需3bit来表达,为了描述更通用的情况,所以用了32bit)来表达AA列上的值,我们需要32个bit vector。


●生成bit-wise索引

如图2所示。bit vector中的位图的数量与表中记录的数量一样。

2.2 单值查找

假设我们执行条件为where AA=1的查询。1的二进制表示是{0…0,1},分别与bit-vector执行and运算,结果见图3。通过结果bit-vector即可获取目标记录,通过bit-vector进行集合运算也是非常方便的,比如count运算。


2.3 范围查找

       假设我们执行条件为where AA>1的查询。

1)忽略目标值低位连续为1的位

在本例中我们可以忽略最低位。假如查询的条件为where AA > 11,11的二进制表示为{0…1011},则我们可以忽略最低的2位,即第1位和第2位。

2)从低位开始,依次处理目标值的每个bit

设V1是一个bit-vector,大小是表记录的数量,各个bit的值初始化为0。

从低位开始,依次处理目标值的各个bit。如果bit为0,则把V1和索引进行或操作,把结果写入V1;如果bit为1,则把V1和索引进行与操作,把结果写入V1。

如图4所示。由于第1为被忽略,所以先处理第2个bit,由于第2个bit为0,所以把V1和索引的第2个bit-vector进行或操作,把结果赋值给V1,见R2;然后处理第3个bit,由于第3个bit为0,把R2与索引的第3个bit-vector执行或操作,把结果赋值给V1,见R3;处理第32位以后,V1的值见RA。RA中值为1的行记为目标记录,即符合条件where AA>1的行。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章