教你如何成為Oracle 10g OCP - 第九章 物件管理(9) - 點陣圖(Bitmap)索引

tolywang發表於2011-02-18

 

9.2.6  點陣圖(Bitmap)索引


http://space.itpub.net/9842/viewspace-343286 

點陣圖索引是另外一個索引型別,組織形式和b-tree索引相同,也是一顆平衡樹,區別
在於葉子節點裡存放索引條目的方式不同。前面知道,B數索引的葉子節點對於表裡
的每個資料行,如果索引列的值不為空,則會為這個記錄行在葉子節點中維護一個
對應的索引條目。 而點陣圖索引則不是這樣,葉子節點中存放的索引條目如下:
http://space.itpub.net/9842/viewspace-343286

點陣圖索引非常適用於DSS及資料倉儲系統,他們可以使用較少的基數(唯一鍵數目,
比如男和女,基數為2)列,訪問非常大的表,儘管點陣圖索引最多可以達到30個列,
但是一般都只用於少量的列。對於那些有較低基數的列要使用點陣圖索引。點陣圖索引
對於低基數(少量不同值)的列來說非常快,這是因為索引的大小相對於B樹索引來說
小很多,因為這些索引是低基數的B樹索引。


在表上建立索引後,點陣圖索引條目上(葉子節點中)還包含表裡第一條記錄所對應的rowid
及最後一條記錄所對應的rowid, 所以條目的最後一部分則是由多個bit位組成的bitmap,
每個bit位就對應一條記錄。 格式:

key   start rowid    end rowid      bitmap
<01,     AAAAAA    ,   ZZZZZZ ,   1000100100011001001 >
<02,     AAAAAA    ,   ZZZZZZ ,   0101100100011100010 >
<03,     AAAAAA    ,   ZZZZZZ ,   0000100101101001001 >


bitmap中沒有直接記錄rowid, 而是記錄了一個點陣圖, 點陣圖中的每一個bit位都對應一個rowid,
之間有轉換關係的.所以用bitmap索引的時候你可以在執行計劃裡看到 bitmap to rowid 這樣的步驟.

 


當我們發出where c1='01'這樣的SQL時,oracle會搜尋01所在的索引條目,然後掃描該
索引條目中的bitmap裡的所有bit位。第一個bit位是1,表示第一條上的c1的值是01,
於是返回第一條記錄所在的rowid(根據該索引條目裡記錄的start rowid加上行號得到
該記錄所在的rowid), 第二個bit位為0, 則說明第二條記錄上的c1值不為01,依此類推。
特別注意,如果索引列為空,也會在點陣圖索引中記錄,對應的bit位為0 ;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-687520/,如需轉載,請註明出處,否則將追究法律責任。

相關文章