全部產品
Search
文件中心

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

更新時間:Nov 27, 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_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}'))