理解SAP BW 中的 Bit-Map Indexing

wolfinflow發表於2010-01-26

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章