すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:Roaring Bitmap

最終更新日:Mar 29, 2026

Roaring Bitmap は、積集合、和集合、差集合、重複排除などの集合演算に最適化された圧縮ビットマップです。従来のビットマップよりも大幅に少ないメモリ使用量で、より高速なパフォーマンスを実現するため、ユーザープロファイリング、パーソナライズドレコメンデーション、精密マーケティングなどのワークロードに適しています。

前提条件

開始する前に、以下を確認してください:

仕組み

Roaring Bitmap は、各 32 ビット整数を上位 16 ビット (チャンクキーとして格納) と下位 16 ビット (コンテナに格納) に分割してエンコードします。各チャンクは最大 2^16 個の整数を保持し、チャンクは動的に拡張される配列にソートされるため、二分探索によって任意の値が迅速に特定できます。

コンテナは、データ特性に基づいて自動的に選択されます:

コンテナタイプ使用される条件容量
配列コンテナスパースで非連続な値4,096 未満の整数
ビットマップコンテナデンスで連続した整数4,096 以上の整数
コンテナの実行連続した昇順の値が長く続く場合配列コンテナとビットマップコンテナの両方より小さい

この適応型ストレージレイアウトにより、高い圧縮率が維持され、コンテナタイプ間で直接 AND、OR、XOR 演算が可能になります。基盤となるデータ構造の詳細については、「CRoaring リポジトリ」をご参照ください。

利用手順

以下の手順では、拡張機能のインストール、テーブルの作成、データの挿入、ビットマップクエリの実行までの一連のワークフローを説明します。

1. 拡張機能のインストール

インスタンスの[拡張]ページで、roaringbitmap 拡張をインストールします。

2. roaringbitmap 列を持つテーブルの作成

CREATE TABLE t1 (id integer, bitmap roaringbitmap);

3. roaringbitmap データの挿入

RB_BUILD を使用して明示的な整数配列からビットマップを構築するか、RB_BUILD_AGG を使用して一連の整数を集計してビットマップを構築します。

-- 明示的な配列からビットマップを構築 (位置 1-9 と 200 にビットをセット)
INSERT INTO t1 SELECT 1, RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]);

-- 生成された 1-100 の整数シリーズを集計してビットマップを構築
INSERT INTO t1 SELECT 2, RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;

4. ビット位置のクエリ

RB_ITERATE は、ビットが 1 に設定されている各整数位置を返します。

SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;

5. ビットマップ集合演算の実行

関数構文または同等の演算子構文を使用します。どちらも同じ結果を生成します。

-- OR: 2 つのビットマップの和集合 (関数構文)
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: 2 つのビットマップの和集合 (演算子構文)
SELECT a.bitmap | b.bitmap
FROM (SELECT bitmap FROM t1 WHERE id = 1) AS a,
     (SELECT bitmap FROM t1 WHERE id = 2) AS b;

6. 行をまたがるビットマップの集計

SELECT RB_OR_AGG(bitmap)  FROM t1;   -- すべてのビットマップの和集合
SELECT RB_AND_AGG(bitmap) FROM t1;   -- すべてのビットマップの積集合
SELECT RB_XOR_AGG(bitmap) FROM t1;   -- すべてのビットマップの対称差

7. セットされたビットのカウント (カーディナリティ)

SELECT RB_CARDINALITY(bitmap) FROM t1;

ビットマップ計算関数

関数入力出力説明結果
rb_buildinteger[]roaringbitmap整数配列から roaring bitmap を作成します。rb_build('{1,2,3,4,5}'){1,2,3,4,5}
rb_androaringbitmap, roaringbitmaproaringbitmapAND 演算を実行します。rb_and(rb_build('{1,2,3}'), rb_build('{3,4,5}')){3}
rb_orroaringbitmap, roaringbitmaproaringbitmapOR 演算を実行します。rb_or(rb_build('{1,2,3}'), rb_build('{3,4,5}')){1,2,3,4,5}
rb_xorroaringbitmap, roaringbitmaproaringbitmapXOR 演算を実行します。rb_xor(rb_build('{1,2,3}'), rb_build('{3,4,5}')){1,2,4,5}
rb_andnotroaringbitmap, roaringbitmaproaringbitmapANDNOT 演算を実行します。rb_andnot(rb_build('{1,2,3}'), rb_build('{3,4,5}')){1,2}
rb_cardinalityroaringbitmapintegerセットされたビットの数を返します。rb_cardinality(rb_build('{1,2,3,4,5}'))5
rb_and_cardinalityroaringbitmap, roaringbitmapintegerAND 演算結果のカーディナリティを返します。rb_and_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}'))1
rb_or_cardinalityroaringbitmap, roaringbitmapintegerOR 演算結果のカーディナリティを返します。rb_or_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}'))5
rb_xor_cardinalityroaringbitmap, roaringbitmapintegerXOR 演算結果のカーディナリティを返します。rb_xor_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}'))4
rb_andnot_cardinalityroaringbitmap, roaringbitmapintegerANDNOT 演算結果のカーディナリティを返します。rb_andnot_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}'))2
rb_is_emptyroaringbitmapbooleanroaring bitmap が空かどうかをチェックします。rb_is_empty(rb_build('{1,2,3,4,5}'))false
rb_equalsroaringbitmap, roaringbitmapboolean2 つの roaring bitmap が等しいかどうかをチェックします。rb_equals(rb_build('{1,2,3}'), rb_build('{3,4,5}'))false
rb_intersectroaringbitmap, roaringbitmapboolean2 つの roaring bitmap が交差するかどうかをチェックします。rb_intersect(rb_build('{1,2,3}'), rb_build('{3,4,5}'))true
rb_removeroaringbitmap, integerroaringbitmap特定のオフセットを削除します。rb_remove(rb_build('{1,2,3}'), 3){1,2}
rb_removeroaringbitmap, integer, integerroaringbitmap特定のオフセット範囲を削除します。rb_remove(rb_build('{1,2,3,4,6,7,8}'), 6, 8){1,2,3,4}
rb_fliproaringbitmap, integerroaringbitmap特定のオフセットのビットを反転させます。rb_flip(rb_build('{1,2,3}'), 3){1,2}
rb_fliproaringbitmap, integer, integerroaringbitmap特定のオフセット範囲のすべてのビットを反転させます。rb_flip(rb_build('{1,2,3}'), 2, 3)
rb_minimumroaringbitmapintegerセットされた最小のオフセットを返します。ビットマップが空の場合は -1 を返します。rb_minimum(rb_build('{1,2,3}'))1
rb_maximumroaringbitmapintegerセットされた最大のオフセットを返します。ビットマップが空の場合は 0 を返します。rb_maximum(rb_build('{1,2,3}'))3
rb_rankroaringbitmap, integerinteger指定された値以下のセットされたオフセットの数を返します。rb_rank(rb_build('{1,2,3}'), 3)3
rb_iterateroaringbitmapsetof integerセットされた各オフセットを行として返します。rb_iterate(rb_build('{1,2,3}'))123 (1 行に 1 つ)
rb_iterate_decrementroaringbitmapinteger[]セットされたすべてのオフセットを降順の配列として返します。rb_iterate_decrement(rb_build('{1,2,3,4}')){4,3,2,1}
rb_containsroaringbitmap, integerbooleanビットマップが特定のオフセットを含むかどうかをチェックします。rb_contains(rb_build('{1,2,3}'), 1)true
rb_containsroaringbitmap, integer, integerbooleanビットマップが特定のオフセット範囲を含むかどうかをチェックします。rb_contains(rb_build('{1,2,3}'), rb_build('{3,4,5}'))
rb_containsroaringbitmap, roaringbitmapbooleanあるビットマップが別のビットマップを含むかどうかをチェックします。rb_contains(rb_build('{1,2,3}'), rb_build('{3,4,5}'))false
rb_becontainedinteger, roaringbitmapboolean特定のオフセットがビットマップに含まれるかどうかをチェックします。rb_becontained(1, rb_build('{1,2,3}'))true
rb_becontainedroaringbitmap, roaringbitmapbooleanあるビットマップが別のビットマップに含まれるかどうかをチェックします。rb_becontained(rb_build('{1}'), rb_build('{1,2,3}'))true
rb_addroaringbitmap, integerroaringbitmap特定のオフセットを追加します。rb_add(rb_build('{1,2,3,4}'), 5){1,2,3,4,5}
rb_addroaringbitmap, integer, integerroaringbitmap特定のオフセット範囲を追加します。rb_add(rb_build('{1,2,3,4}'), 6, 8){1,2,3,4,6,7,8}
rb_add_2integer, roaringbitmaproaringbitmapビットマップに特定のオフセットを追加します (引数の順序が逆)。rb_add_2(5, rb_build('{1,2,3,4}')){1,2,3,4,5}
rb_jaccard_indexroaringbitmap, roaringbitmapfloat82 つのビットマップ間のジャカード類似係数を計算します。rb_jaccard_index(rb_build('{1,2,3,4}'), rb_build('{1,2}'))0.5
rb_to_arrayroaringbitmapinteger[]roaring bitmap を整数配列に変換します。rb_to_array(rb_build('{1,2,3,4}')){1,2,3,4}

ビットマップ集計関数

関数入力出力説明結果
rb_build_aggintegerroaringbitmap一連のオフセットを集計して roaring bitmap にします。rb_build_agg(1){1}
rb_or_aggroaringbitmaproaringbitmap行をまたいで OR 集計操作を実行します。rb_or_agg(rb_build('{1,2,3}')){1,2,3}
rb_and_aggroaringbitmaproaringbitmap行をまたいで AND 集計操作を実行します。rb_and_agg(rb_build('{1,2,3}')){1,2,3}
rb_xor_aggroaringbitmaproaringbitmap行をまたいで XOR 集計操作を実行します。rb_xor_agg(rb_build('{1,2,3}')){1,2,3}
rb_or_cardinality_aggroaringbitmapintegerOR 集計結果のカーディナリティを返します。rb_or_cardinality_agg(rb_build('{1,2,3}'))3
rb_and_cardinality_aggroaringbitmapintegerAND 集計結果のカーディナリティを返します。rb_and_cardinality_agg(rb_build('{1,2,3}'))3
rb_xor_cardinality_aggroaringbitmapintegerXOR 集計結果のカーディナリティを返します。rb_xor_cardinality_agg(rb_build('{1,2,3}'))3

演算子

すべての演算子には、前のセクションに記載されている同等の関数形式があります。演算子構文は、インライン SQL 式でより簡潔です。

オペレーター出力説明
&roaringbitmaproaringbitmaproaringbitmapAND 演算。rb_build('{1,2,3}') & rb_build('{1,2,4}')
|roaringbitmaproaringbitmaproaringbitmapOR 演算。rb_build('{1,2}') | rb_build('{1,3}')
#roaringbitmaproaringbitmaproaringbitmapXOR 演算。rb_build('{1,2}') # rb_build('{1,3}')
~roaringbitmaproaringbitmaproaringbitmapANDNOT 演算。rb_build('{2,3}') ~ rb_build('{2,4}')
+roaringbitmapintegerroaringbitmap特定のオフセットを追加します。rb_build('{2,3}') + 1
-roaringbitmapintegerroaringbitmap特定のオフセットを削除します。rb_build('{1,2,3}') - 1
=roaringbitmaproaringbitmapboolean2 つのビットマップが等しいかどうかをチェックします。rb_build('{2,3}') = rb_build('{2,3}')
<>roaringbitmaproaringbitmapboolean2 つのビットマップが異なるかどうかをチェックします。rb_build('{2,3}') <> rb_build('{1,2,3}')
&&roaringbitmaproaringbitmapboolean2 つのビットマップが交差するかどうかをチェックします。rb_build('{2,3}') && rb_build('{3,4}')
@>roaringbitmaproaringbitmapboolean左のビットマップが右のビットマップを含むかどうかをチェックします。rb_build('{2,3}') @> rb_build('{2}')
@>roaringbitmapintegerbooleanビットマップが特定のオフセットを含むかどうかをチェックします。rb_build('{2,3}') @> 2
<@roaringbitmaproaringbitmapboolean左のビットマップが右のビットマップに含まれるかどうかをチェックします。rb_build('{2,3}') <@ rb_build('{1,2,3}')
<@integerroaringbitmapbooleanオフセットがビットマップに含まれるかどうかをチェックします。2 <@ rb_build('{2,3}')