このトピックでは、ApsaraDB RDS for PostgreSQLが提供するroaringbitmap拡張機能を使用してクエリのパフォーマンスを向上させる方法について説明します。
前提条件
RDSインスタンスはPostgreSQL 12以降を実行します。
この拡張機能は、PostgreSQL 17を実行するApsaraDB RDS for PostgreSQLインスタンスではサポートされていません。
背景情報
轟音ビットマップでは、32ビットの整数が2つの16チャンクに分割されます。 各チャンク内の整数は、同じ16の最上位ビットを共有する。 整数の下位16ビットはコンテナに格納される。 轟音ビットマップは、コンテナを一次インデックスとして動的配列に格納します。 2つのタイプのコンテナが利用可能である: 疎チャンクのための配列コンテナおよび密チャンクのためのビットマップコンテナ。 配列コンテナーには、最大4,096個の整数を格納できます。 ビットマップコンテナには、4,096を超える整数を格納できます。
咆哮するビットマップは、このストレージ構造を使用して特定の値をすばやく取得できます。 さらに、轟音ビットマップは、2つのタイプのコンテナ間のAND、OR、およびXORなどのビットごとの演算を提供する。 したがって、とどろくビットマップは優れたストレージとコンピューティング性能を提供できます。
使用上の注意
拡張機能の安定性を確保するため、RDSインスタンスを最新のマイナーエンジンバージョンに更新することを推奨します。
RDSインスタンスのマイナーエンジンバージョンを更新する方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
手順
エクステンションを作成します。 例:
CREATE EXTENSION roaringbitmap;
roaringbitmapデータの格納に使用するテーブルを作成します。 例:
CREATE TABLE t1 (id integer, bitmap roaringbitmap);
rb_build関数を呼び出してroaringbitmapデータを挿入します。 例:
-- Set the bit value of an array to 1. INSERT INTO t1 SELECT 1,RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); -- Set the bit values of multiple elements to 1 and aggregate the bit values into a roaring bitmap. INSERT INTO t1 SELECT 2,RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
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;
OR、AND、XOR、BUILDなどのビットマップ集計演算を実行して、新しい轟音ビットマップを生成します。 例:
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;
轟音ビットマップのカーディナリティを計算します。 カーディナリティは、轟音ビットマップにおいて1に設定されるビットの数である。 例:
SELECT RB_CARDINALITY(bitmap) FROM t1;
1に設定されているビットのサブスクリプトを取得します。 例:
SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;
ビットマップ計算関数
関数 | 入力 | 出力 | 説明 | 例 |
rb_build | integer[] | roaringbitmap | 整数配列から轟音ビットマップを作成します。 |
|
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 | 2つの轟音ビットマップのAND演算からカーディナリティを計算します。 |
|
rb_or_cardinality | roaringbitmap,roaringbitmap | integer | 2つの轟音ビットマップのOR演算からカーディナリティを計算します。 |
|
rb_xor_cardinality | roaringbitmap,roaringbitmap | integer | 2つの轟音ビットマップのXOR演算からカーディナリティを計算します。 |
|
rb_andnot_cardinality | roaringbitmap,roaringbitmap | integer | 2つの轟音ビットマップのANDNOT演算からカーディナリティを計算します。 |
|
rb_is_empty | roaringbitmap | Boolean | 轟音ビットマップが空かどうかをチェックします。 |
|
rb_equals | roaringbitmap,roaringbitmap | Boolean | 2つの轟音ビットマップが同じかどうかをチェックします。 |
|
rb_intersect | roaringbitmap,roaringbitmap | Boolean | 2つの轟音ビットマップが交差するかどうかを確認します。 |
|
rb_remove | roaringbitmap,integer | roaringbitmap | 轟音ビットマップから特定のオフセットを削除します。 |
|
rb_flip | roaringbitmap,integer,integer | roaringbitmap | 轟音ビットマップの特定のオフセットを反転します。 |
|
rb_minimum | roaringbitmap | integer | 轟音ビットマップの最小オフセットを返します。 轟音ビットマップが空の場合、-1が返されます。 |
|
rb_maximum | roaringbitmap | integer | 轟音ビットマップで最大のオフセットを返します。 轟音ビットマップが空の場合、0が返されます。 |
|
rb_rank | roaringbitmap,integer | integer | 轟音ビットマップ内の指定されたオフセット以下の要素の数を返します。 |
|
rb_iterate | roaringbitmap | setof整数 | 轟音ビットマップからのオフセットのリストを返します。 |
|
ビットマップ集計関数Bitmap aggregate functions
関数 | 入力 | 出力 | 説明 | 例 |
rb_build_agg | integer | roaringbitmap | オフセットのグループから轟音ビットマップを作成します。 |
|
rb_or_agg | roaringbitmap | roaringbitmap | OR集計操作を実行します。 |
|
rb_and_agg | roaringbitmap | roaringbitmap | AND集計操作を実行します。 |
|
rb_xor_agg | roaringbitmap | roaringbitmap | XOR集計演算を実行します。 |
|
rb_or_cardinality_agg | roaringbitmap | integer | 2つの轟音ビットマップのOR集計演算からカーディナリティを計算します。 |
|
rb_and_cardinality_agg | roaringbitmap | integer | 2つの轟音ビットマップのAND集計演算からカーディナリティを計算します。 |
|
rb_xor_cardinality_agg | roaringbitmap | integer | 2つの轟音ビットマップのXOR集計演算からカーディナリティを計算します。 |
|