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無論在存儲和計算性能上都表現優秀。

注意事項

為確保插件的穩定性,建議升級到最新內核小版本。
說明 如需升級內核小版本,請參見升級內核小版本。

操作步驟

  1. 創建插件。示例如下:
    CREATE EXTENSION roaringbitmap;
  2. 創建帶有RoaringBitmap數據類型的表。示例如下:
    CREATE TABLE t1 (id integer, bitmap roaringbitmap);
  3. 使用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;
  4. 進行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;
  5. 進行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;
  6. 統計基數(Cardinality),即統計roaringbitmap中包含多少個位置為1的BIT位。示例如下:
    SELECT RB_CARDINALITY(bitmap) FROM t1;
  7. 從roaringbitmap中返回位置為1的BIT下標(即位置值)。示例如下:
    SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;

Bitmap函數列表

函數名 輸入 輸出 描述 示例
rb_build integer[] roaringbitmap 通過數組創建一個Bitmap。
rb_build('{1,2,3,4,5}')
rb_and roaringbitmap,roaringbitmap roaringbitmap And計算。
rb_and(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_or roaringbitmap,roaringbitmap roaringbitmap Or計算。
rb_or(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xor roaringbitmap,roaringbitmap roaringbitmap Xor計算。
rb_xor(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnot roaringbitmap,roaringbitmap roaringbitmap AndNot計算。
rb_andnot(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_cardinality roaringbitmap integer 統計基數。
rb_cardinality(rb_build('{1,2,3,4,5}'))
rb_and_cardinality roaringbitmap,roaringbitmap integer And計算并返回基數。
rb_and_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_or_cardinality roaringbitmap,roaringbitmap integer Or計算并返回基數。
rb_or_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xor_cardinality roaringbitmap,roaringbitmap integer Xor計算并返回基數。
rb_xor_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnot_cardinality roaringbitmap,roaringbitmap integer AndNot計算并返回基數。
rb_andnot_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_is_empty roaringbitmap boolean 判斷是否為空的Bitmap。
rb_is_empty(rb_build('{1,2,3,4,5}'))
rb_equals roaringbitmap,roaringbitmap boolean 判斷兩個Bitmap是否相等。
rb_equals(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_intersect roaringbitmap,roaringbitmap boolean 判斷兩個Bitmap是否相交。
rb_intersect(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_remove roaringbitmap,integer roaringbitmap 從Bitmap移除特定的Offset。
rb_remove(rb_build('{1,2,3}'),3)
rb_flip roaringbitmap,integer,integer roaringbitmap 翻轉Bitmap中特定的Offset段。
rb_flip(rb_build('{1,2,3}'),2,3)
rb_minimum roaringbitmap integer 返回Bitmap中最小的Offset,如果Bitmap為空則返回-1。
rb_minimum(rb_build('{1,2,3}'))
rb_maximum roaringbitmap integer 返回Bitmap中最大的Offset,如果Bitmap為空則返回0。
rb_maximum(rb_build('{1,2,3}'))
rb_rank roaringbitmap,integer integer 返回Bitmap中小于等于指定Offset的基數。
rb_rank(rb_build('{1,2,3}'),3)
rb_iterate roaringbitmap setof integer 返回Offset List。
rb_iterate(rb_build('{1,2,3}'))

Bitmap聚合函數列表

聚合函數名 輸入 輸出 描述 示例
rb_build_agg integer roaringbitmap 將Offset聚合成bitmap。
rb_build_agg(1)
rb_or_agg roaringbitmap roaringbitmap Or 聚合計算。
rb_or_agg(rb_build('{1,2,3}'))
rb_and_agg roaringbitmap roaringbitmap And 聚合計算。
rb_and_agg(rb_build('{1,2,3}'))
rb_xor_agg roaringbitmap roaringbitmap Xor 聚合計算。
rb_xor_agg(rb_build('{1,2,3}'))
rb_or_cardinality_agg roaringbitmap integer Or 聚合計算并返回其基數。
rb_or_cardinality_agg(rb_build('{1,2,3}'))
rb_and_cardinality_agg roaringbitmap integer And 聚合計算并返回其基數。
rb_and_cardinality_agg(rb_build('{1,2,3}'))
rb_xor_cardinality_agg roaringbitmap integer Xor 聚合計算并返回其基數。
rb_xor_cardinality_agg(rb_build('{1,2,3}'))