列式数据库中的几种索引

数据仓库主要用来进行OLAP任务,区别于传统的OLTP数据库,数据仓库对数据吞吐量的要求更高.
现在很多数据仓库都是列式数据库,比如infobright,Sybase IQ等.
前一段时间进行了一下对这些列式数据库的研究,发现了它们很多不同于传统行式数据库的特点.下面简单谈一下这些列式数据库中使用的索引.
1 块级粗粒度索引
顾名思义,就是把数据分块,对块建立索引而不是对条目建立.块级索引一般都是粗粒度的.下图就是infobright的块级索引示意图.



可以看出,它每个数据块的块索引记录该块数据的最大值和最小值,这样查询时,根据条件,就可以判断符合条件的数据是否命中该数据块,而且,如果进行max,sum等聚合操作,可以直接从块索引读取数据而不用读取块内数据.
无独有偶,hive的ORC file也采用了相似的存储格式



2 reduced B+树
B+树大家都很熟悉,但是用在OLTP数据库中的B+树,因为数据需要频繁更新插入,在B+树数据块中往往需要留有冗余空间,用来防止B+树的节点空间不足导致B+树的分裂.而列式数据库因为一般都是批量导入数据,数据插入更新操作少,所以可以在导入数据时用自底向上的方法创建B+树,同时可以缩小B+树数据块中的冗余空间,使得B+树更加紧凑.
3 位图索引
位图索引一般建立在列的cardinality比较低的情况下.比如性别属性只有男和女,那么这个列的cardinality就是2.这样的列适合用来建立位图索引



4 sybase的一种位图索引
从上面可以看出,位图索引一般用来存储cardinality比较小的数据,而且往往不能进行范围查找,比如大于小于之类.不过sybase有一项专利,用位向量存储索引,仍然可以支持大于运算符



有兴趣的同学可以读一下这篇专利 Method and apparatus for indexing database columns with bit vectors,把它的方法告诉大家

猜你喜欢

转载自kabike.iteye.com/blog/2168856
今日推荐