全部產品
Search
文件中心

ApsaraDB RDS:位元影像計算(roaringbitmap)

更新時間:Jun 19, 2024

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_buildinteger[]roaringbitmap通過數組建立一個Bitmap。
rb_build('{1,2,3,4,5}')
rb_androaringbitmap,roaringbitmaproaringbitmapAnd計算。
rb_and(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_orroaringbitmap,roaringbitmaproaringbitmapOr計算。
rb_or(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xorroaringbitmap,roaringbitmaproaringbitmapXor計算。
rb_xor(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnotroaringbitmap,roaringbitmaproaringbitmapAndNot計算。
rb_andnot(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_cardinalityroaringbitmapinteger統計基數。
rb_cardinality(rb_build('{1,2,3,4,5}'))
rb_and_cardinalityroaringbitmap,roaringbitmapintegerAnd計算並返回基數。
rb_and_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_or_cardinalityroaringbitmap,roaringbitmapintegerOr計算並返回基數。
rb_or_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xor_cardinalityroaringbitmap,roaringbitmapintegerXor計算並返回基數。
rb_xor_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnot_cardinalityroaringbitmap,roaringbitmapintegerAndNot計算並返回基數。
rb_andnot_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_is_emptyroaringbitmapboolean判斷是否為空白的Bitmap。
rb_is_empty(rb_build('{1,2,3,4,5}'))
rb_equalsroaringbitmap,roaringbitmapboolean判斷兩個Bitmap是否相等。
rb_equals(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_intersectroaringbitmap,roaringbitmapboolean判斷兩個Bitmap是否相交。
rb_intersect(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_removeroaringbitmap,integerroaringbitmap從Bitmap移除特定的Offset。
rb_remove(rb_build('{1,2,3}'),3)
rb_fliproaringbitmap,integer,integerroaringbitmap翻轉Bitmap中特定的Offset段。
rb_flip(rb_build('{1,2,3}'),2,3)
rb_minimumroaringbitmapinteger返回Bitmap中最小的Offset,如果Bitmap為空白則返回-1。
rb_minimum(rb_build('{1,2,3}'))
rb_maximumroaringbitmapinteger返回Bitmap中最大的Offset,如果Bitmap為空白則返回0。
rb_maximum(rb_build('{1,2,3}'))
rb_rankroaringbitmap,integerinteger返回Bitmap中小於等於指定Offset的基數。
rb_rank(rb_build('{1,2,3}'),3)
rb_iterateroaringbitmapsetof integer返回Offset List。
rb_iterate(rb_build('{1,2,3}'))

Bitmap彙總函式列表

彙總函式名輸入輸出描述樣本
rb_build_aggintegerroaringbitmap將Offset彙總成bitmap。
rb_build_agg(1)
rb_or_aggroaringbitmaproaringbitmapOr 彙總計算。
rb_or_agg(rb_build('{1,2,3}'))
rb_and_aggroaringbitmaproaringbitmapAnd 彙總計算。
rb_and_agg(rb_build('{1,2,3}'))
rb_xor_aggroaringbitmaproaringbitmapXor 彙總計算。
rb_xor_agg(rb_build('{1,2,3}'))
rb_or_cardinality_aggroaringbitmapintegerOr 彙總計算並返回其基數。
rb_or_cardinality_agg(rb_build('{1,2,3}'))
rb_and_cardinality_aggroaringbitmapintegerAnd 彙總計算並返回其基數。
rb_and_cardinality_agg(rb_build('{1,2,3}'))
rb_xor_cardinality_aggroaringbitmapintegerXor 彙總計算並返回其基數。
rb_xor_cardinality_agg(rb_build('{1,2,3}'))