racle B-Tree和Bitmap索引对比详解
?http://space.itpub.net/13062352/viewspace-614553
oracle B-Tree和Bitmap索引對比詳解
B樹索引是所有大型關系數據庫畢用的技術,也是oracle數據庫默認的索引技術。
基數:指的是你要創建索引的列中所包含的不同鍵值的數量。例如我們的列是性別,那么它的鍵值就是男、女所以你的索引基數是2.
oracle中每個表的行都有一個rowid,用于標記這個行在數據庫中的位置。
關于索引:
B-TREE索引,結構如下:
?????????????? root
?????????????? / | \
? branch1 ........
???? /|\ ......................
leaf1......
leaf節點的結構是這樣的:
?? |索引頭|列長度|列內容|rowid(s)|
一個葉子節點的大小大概是8192*8bit,因此一個字段的長度即使是50,那么一個節點大概能分成100個子節點,那么100萬的記錄,也只需要3級節點即可索引完畢,因此一般b-tree的深度不超過4級,這樣根據b-tree來查找一條記錄,最多只需遍歷4個節點找到rowid,再根據rowid查找磁盤即可得到最終記錄數據。
對某列查詢的結果集記錄數如果通常都小于7%,則應該在該列添加索引。對b-tree來說,where xx is null條件是不會利用索引的,因此建議這種列應該設置默認值,以避免該列的值存在null的情況,同樣group by 中如果該列有null索引也可能無效。
bitmap索引:
bitmap索引的結構也是樹形結構,但是葉子節點的結構與b-tree不一樣。bitmap葉子節點的結果大概如下:
<key1 start-rowid? end-rowid? bitmap>
<key2 start-rowid? end-rowid? bitmap>
......
其中bitmap的內容是110010100011100001這樣的01組合形式,它的長度與start-rowid和end-rowid之間包含的rowid數量一致。這樣假設范圍內第9個rowid對應列的內容是key1,那么kei1對應的bitmap中第9個字符的值就是1,否則就是0。同樣每個塊的大小是8192*8,那么一個bitmap索引的葉子節點大概能索引10000條記錄。
bitmap索引對null的字段依然有效,具體null的值在bitmap中是取0還是專門有個keyX的值是null來區分需要再查證。bitmap索引對or條件的查詢效果非常好,它不適應與索引列的值經常變化的情況,如果索引列的值經常變化,那么對bitmap索引將是災難性的,因為它要鎖定所有相關的葉子節點所在的塊來更新bitmap的值,它適用于決策支持系統。
?
總結
以上是生活随笔為你收集整理的racle B-Tree和Bitmap索引对比详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 五种索引创建
- 下一篇: 删除主键