RDS PostgreSQL提供roaringbitmap外掛程式,可以使用位元影像計算功能,提高查詢效能。
前提條件
執行個體為RDS PostgreSQL 12或以上版本。
背景資訊
Roaring Bitmap演算法是將32位的INT類型資料劃分為216個資料區塊(Chunk),每一個資料區塊對應整數的高16位,並使用一個容器(Container)來存放一個數值的低16位。Roaring Bitmap將這些容器儲存在一個動態數組中,作為一級索引。容器使用兩種不同的結構:數組容器(Array Container)和位元影像容器(Bitmap Container)。數組容器存放稀疏的資料,位元影像容器存放稠密的資料。如果一個容器裡面的整數數量小於4096,就用數組容器來儲存值。若大於4096,就用位元影像容器來儲存值。
採用這種儲存結構,Roaring Bitmap可以快速檢索一個特定的值。在做位元影像計算(AND、OR、XOR)時,Roaring Bitmap提供了相應的演算法來高效地實現在兩種容器之間的運算。使得Roaring Bitmap無論在儲存和計算效能上都表現優秀。
注意事項
為確保外掛程式的穩定性,建議升級到最新核心小版本。
如需升級核心小版本,請參見升級核心小版本。
操作步驟
建立外掛程式。樣本如下:
CREATE EXTENSION roaringbitmap;
建立帶有RoaringBitmap資料類型的表。樣本如下:
CREATE TABLE t1 (id integer, bitmap roaringbitmap);
使用rb_build函數插入roaringbitmap的資料。樣本如下:
--數組位置對應的BIT值為1 INSERT INTO t1 SELECT 1,RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); --將輸入的多條記錄的值對應位置的BIT值設定為1,最後彙總為一個roaringbitmap INSERT INTO t1 SELECT 2,RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
進行Bitmap計算(OR、AND、XOR、ANDNOT)。樣本如下:
SELECT RB_OR(a.bitmap,b.bitmap) FROM (SELECT bitmap FROM t1 WHERE id = 1) AS a,(SELECT bitmap FROM t1 WHERE id = 2) AS b;
進行Bitmap彙總計算(OR、AND、XOR、BUILD),並產生新的roaringbitmap類型。樣本如下:
SELECT RB_OR_AGG(bitmap) FROM t1; SELECT RB_AND_AGG(bitmap) FROM t1; SELECT RB_XOR_AGG(bitmap) FROM t1; SELECT RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
統計基數(Cardinality),即統計roaringbitmap中包含多少個位置為1的BIT位。樣本如下:
SELECT RB_CARDINALITY(bitmap) FROM t1;
從roaringbitmap中返回位置為1的BIT下標(即位置值)。樣本如下:
SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;
Bitmap函數列表
函數名 | 輸入 | 輸出 | 描述 | 樣本 |
rb_build | integer[] | roaringbitmap | 通過數組建立一個Bitmap。 |
|
rb_and | roaringbitmap,roaringbitmap | roaringbitmap | And計算。 |
|
rb_or | roaringbitmap,roaringbitmap | roaringbitmap | Or計算。 |
|
rb_xor | roaringbitmap,roaringbitmap | roaringbitmap | Xor計算。 |
|
rb_andnot | roaringbitmap,roaringbitmap | roaringbitmap | AndNot計算。 |
|
rb_cardinality | roaringbitmap | integer | 統計基數。 |
|
rb_and_cardinality | roaringbitmap,roaringbitmap | integer | And計算並返回基數。 |
|
rb_or_cardinality | roaringbitmap,roaringbitmap | integer | Or計算並返回基數。 |
|
rb_xor_cardinality | roaringbitmap,roaringbitmap | integer | Xor計算並返回基數。 |
|
rb_andnot_cardinality | roaringbitmap,roaringbitmap | integer | AndNot計算並返回基數。 |
|
rb_is_empty | roaringbitmap | boolean | 判斷是否為空白的Bitmap。 |
|
rb_equals | roaringbitmap,roaringbitmap | boolean | 判斷兩個Bitmap是否相等。 |
|
rb_intersect | roaringbitmap,roaringbitmap | boolean | 判斷兩個Bitmap是否相交。 |
|
rb_remove | roaringbitmap,integer | roaringbitmap | 從Bitmap移除特定的Offset。 |
|
rb_flip | roaringbitmap,integer,integer | roaringbitmap | 翻轉Bitmap中特定的Offset段。 |
|
rb_minimum | roaringbitmap | integer | 返回Bitmap中最小的Offset,如果Bitmap為空白則返回-1。 |
|
rb_maximum | roaringbitmap | integer | 返回Bitmap中最大的Offset,如果Bitmap為空白則返回0。 |
|
rb_rank | roaringbitmap,integer | integer | 返回Bitmap中小於等於指定Offset的基數。 |
|
rb_iterate | roaringbitmap | setof integer | 返回Offset List。 |
|
Bitmap彙總函式列表
彙總函式名 | 輸入 | 輸出 | 描述 | 樣本 |
rb_build_agg | integer | roaringbitmap | 將Offset彙總成bitmap。 |
|
rb_or_agg | roaringbitmap | roaringbitmap | Or 彙總計算。 |
|
rb_and_agg | roaringbitmap | roaringbitmap | And 彙總計算。 |
|
rb_xor_agg | roaringbitmap | roaringbitmap | Xor 彙總計算。 |
|
rb_or_cardinality_agg | roaringbitmap | integer | Or 彙總計算並返回其基數。 |
|
rb_and_cardinality_agg | roaringbitmap | integer | And 彙總計算並返回其基數。 |
|
rb_xor_cardinality_agg | roaringbitmap | integer | Xor 彙總計算並返回其基數。 |
|