SAP BW 中一般的分析报表都是基于信息立方体的。信息立方体的事实表针对各个维度都有一个默认的索引,但是不同的维度的索引类型可能是不同的:大部分维度使用的都是Bit-Map索引, 这种索引对于低Cardinality的数据效率特别高。而对于高Cardinality的数据,Bit-Map的效率会大大降低,有时候索引甚至比数据更大。这个时候我们就要选择 Line Item 维度 或者High Cardinality 维度, 他们使用的是B-Tree索引。
Cardinality=(一列中相异值的数目)/(表的总记录数)
比如下面这张简单的表
X Y
1 100
2 200
3 100
4 300
5 200
X列的Cardinality是1,而Y列的是3/5=0.6
那么这种索引对于低Cardinality的数据是如何实现高效率的呢?
建立BitMap索引
Bitmap索引首先会将表列的值转化为布尔值存储:1代表真,0代表假。
以下表为例:
X Y Z
1 100 FOO
2 200 BOO
3 100 BOO
4 300 ZOO
5 200 FOO
表中X为主键,Y, Z为非主键。所以我们可以为Y和Z列建立Bitmap索引。为了给Y列建立索引,首先我们要找到Y列的所有可能值:
Y
100
200
300
然后你问自己,对于100来说,从第一行开始知道最后一行,它是否存在于Y列,是就是1,否就是0. 这样你可以得到一个布尔数列,这个数列的位数等于表的记录数:
100: 1 0 1 0 0
或者这么看
X Y Z Y(100)
1 100 FOO 1
2 200 BOO 0
3 100 BOO 1
4 300 ZOO 0
5 200 FOO 0
以此类推我们可以建立Y列的Bitmap索引:
X Y Z Y(100) Y(200) Y(300)
1 100 FOO 1 0 0
2 200 BOO 0 1 0
3 100 BOO 1 0 0
4 300 ZOO 0 0 1
5 200 FOO 0 1 0
即:
Y Bitmap
100 10100
200 01001
300 00010
同理可得Z的索引:
Z Bitmap
FOO 10001
BOO 01100
ZOO 00010
以上是Bitmap索引的生成原理。那么查询是怎么工作在Bitmap索引上面,Bitmap索引是如何提高查询的性能的呢?
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/119153/viewspace-626080/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/119153/viewspace-626080/