PostgreSQL 位圖索引

什麼是位圖索引?
位圖索引就是用一個位圖表格來存放記錄是否可見的結構。
位圖索引的一些特性?
位圖索引實現方法: 用一個BIT位來表示這個屬性對應的值是否存在,存在爲1,不存在爲0.
位圖索引作用範圍:處理狀態值,也可以說可選擇度很高的情形。 
位圖索引的優缺點?
位圖索引優勢: A, 可以很大的壓縮比率節省空間;B,非常快速的定位到檢索值可見與否。
位圖索引缺陷: A,  位圖本身無序存儲,每次檢索對磁盤都是一次隨機IO;B,因爲壓縮存儲,適合OLAP應用。 當然也可以不用壓縮,比如INFOBRIGHT就提供這樣的功能。


PostgreSQL不支持位圖索引,所以也就不支持位圖信息的壓縮存儲。 不過在創建查詢計劃的時候,會爲普通的索引(BTREE,HASH)等建立位圖表,即爲Bitmap Heap Table.
其中
Bitmap Index Scan 用來在內存中創建一個位圖表,每一個BIT表示一個與過濾條件有關的頁面。 此頁面有可能有數據爲1,不可能爲0. 
Bitmap Heap Scan. 在內存中創建好的位圖表指針對應的頁面進行順序掃描,排除不符合的記錄。


來看下位圖掃描的例子。
表bitmap_test 字段is_visible 可選擇性很高,只有兩個值, 
對於查詢語句select is_visible from bitmap_test where is_visible = 'yes'來說,對應的查詢計劃:
                                                                 QUERY PLAN                                              
                   
-------------------------------------------------------------------------------------------------------------------------
-------------------
 Bitmap Heap Scan on bitmap_test  (cost=2023.16..4157.75 rows=99967 width=4) (actual time=24.373..41.054 rows=100000 loop
s=1)
   Recheck Cond: (is_visible = 'yes'::bpchar)
   ->  Bitmap Index Scan on idx_bitmap_is_visible  (cost=0.00..1998.17 rows=99967 width=0) (actual time=24.252..24.252 ro
ws=100000 loops=1)
         Index Cond: (is_visible = 'yes'::bpchar)
 Total runtime: 47.175 ms
(5 rows)


Time: 47.725 ms





從上面這個查詢EXPLAIN結果來看, 先是創建一個位圖表,完了往上推到頁面,在頁面裏重新檢查每行記錄的值滿足過濾條件。 所有完結後,打印結果。

發佈了97 篇原創文章 · 獲贊 2 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章