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

Hologres:Roaringbitmap

最終更新日:Aug 19, 2026

Roaring ビットマップは、効率的に圧縮されたビットマップであり、多くのプログラミング言語やビッグデータプラットフォームでサポートされています。Hologres では、Roaring ビットマップ関数は、超高カーディナリティワークロード (重複排除、タグに基づくフィルタリング、時系列データの収集) に適しています。

仕組み

Roaring ビットマップは、32 ビット整数を 2^16 個のチャンクに分割します。同じチャンク内の整数は、同じ 16 ビットの最上位ビットを共有します。16 ビットの最下位ビットはコンテナに格納されます。コンテナは、プライマリインデックスとして動的配列に保持されます。

2 種類のコンテナタイプが、ストレージとパフォーマンスのバランスを保ちます。

コンテナタイプ 用途 容量
配列コンテナ 疎なチャンク 最大 4,096 個の整数
ビットマップコンテナ 密なチャンク 4,096 個を超える整数

この構造は、高速な値の取得と、コンテナ間での効率的なビット単位の演算 (AND, OR, XOR) を可能にします。

制限

  • RoaringBitmap 関数は、Hologres V0.10 以降の専有インスタンスでのみサポートされています。

    Hologres コンソールでインスタンスバージョンを確認してください。バージョンが V0.10 より前の場合は、コンソールでインスタンスをアップグレードするか、DingTalk グループに参加してテクニカルサポートにお問い合わせください。詳細については、「Common upgrade preparation failure errors」および「Obtain online support for Hologres」をご参照ください。
  • RoaringBitmap 関数は、デフォルトで public スキーマにロードされ、public スキーマにのみロードできます。

  • Hologres V3.1 以降、RoaringBitmap64 データ型がサポートされています。一部の RoaringBitmap 関数は、RoaringBitmap64 型のデータを処理できます。RoaringBitmap64 データを処理する場合、これらの関数は定数入力パラメーターをサポートしません。

  • RoaringBitmap 関数を使用する前に、次のステートメントで拡張を有効化してください。拡張はデータベーススコープであるため、データベースごとに 1 回実行します。新しいデータベースを作成した場合は、再度実行してください。

    -- 拡張を有効にします。
    CREATE EXTENSION roaringbitmap;

    拡張を削除するには、次のステートメントを実行してください。

    DROP EXTENSION roaringbitmap;
    重要

    DROP EXTENSION <extension_name> CASCADE; の使用は避けてください。CASCADE オプションを使用すると、拡張とそのすべてのデータおよび依存オブジェクト (PostGIS データ、RoaringBitmap データ、Proxima データ、バイナリログデータ、BSI データ、依存メタデータ、テーブル、ビュー、サーバーオブジェクトを含む) が削除されます。

  • RoaringBitmap 列は、ビットマップインデックスまたは辞書インデックスとして指定できません。

  • RoaringBitmap 列を含むテーブルを作成する場合は、列の型を roaringbitmap (32 ビット) または roaringbitmap64 (64 ビット) として明示的に指定してください。2 つの型間の混合計算はサポートされていません。

    -- 32 ビットの RoaringBitmap 列を含むテーブルを作成します。
    CREATE TABLE t_rb_32 (
        bucket int,
        x roaringbitmap
    );
    
    -- 64 ビットの RoaringBitmap 列を含むテーブルを作成します。
    CREATE TABLE t_rb_64 (
        bucket int,
        x roaringbitmap64
    );
    
    -- 混合計算はエラーになります。
    -- ERROR: operator does not exist: roaringbitmap & roaringbitmap64
    SELECT
        a.x & b.x
    FROM
        t_rb_32 a
    JOIN t_rb_64 b ON a.bucket = b.bucket;

演算子

以下のすべての演算子は、特に明記されていない限り、 RoaringBitmap と RoaringBitmap64 の両方の型をサポートしています。

演算子 入力タイプ 出力タイプ 説明 例 結果
& RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 入力と同じ AND rb_build('{1,2,3}') & rb_build('{3,4,5}') {3}
| RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 入力と同じ OR rb_build('{1,2,3}') | rb_build('{3,4,5}') {1,2,3,4,5}
| RoaringBitmap | RoaringBitmap64, INTEGER RoaringBitmap | RoaringBitmap64 OR (ビットマップと INTEGER)、 V1.3.16 以降 rb_build('{1,2,3}') | 6 {1,2,3,6}
| INTEGER, RoaringBitmap | RoaringBitmap64 RoaringBitmap | RoaringBitmap64 OR (INTEGER とビットマップ)、 V1.3.16 以降 6 | rb_build('{1,2,3}') {1,2,3,6}
# RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 入力と同じ XOR rb_build('{1,2,3}') # rb_build('{3,4,5}') {1,2,4,5}
<< RoaringBitmap | RoaringBitmap64, BIGINT RoaringBitmap | RoaringBitmap64 左シフト、 V1.3.16 以降 rb_build('{1,2,3}') << 2 {3,4,5}
>> RoaringBitmap | RoaringBitmap64, BIGINT RoaringBitmap | RoaringBitmap64 右シフト、 V1.3.16 以降 rb_build('{1,2,3}') >> 3 {0}
- RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 入力と同じ ANDNOT (ビットマップとビットマップ)、 V1.3.16 以降 rb_build('{1,2,3}') - rb_build('{3,4,5}') {1,2}
- RoaringBitmap | RoaringBitmap64, INTEGER RoaringBitmap | RoaringBitmap64 ANDNOT (ビットマップと INTEGER) rb_build('{1,2,3}') - 3 {1,2}
@> RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 BOOLEAN A が B を含む rb_build('{1,2,3}') @> rb_build('{3,4,5}') false
@> RoaringBitmap | RoaringBitmap64, INTEGER BOOLEAN A が INTEGER を含む rb_build('{1,2,3}') @> 3 true
<@ RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 BOOLEAN A が B に含まれる rb_build('{1,2,3}') <@ rb_build('{3,4,5}') false
<@ INTEGER, RoaringBitmap | RoaringBitmap64 BOOLEAN INTEGER が A に含まれる 3 <@ rb_build('{1,2,3}') true
&& RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 BOOLEAN A が B と共通部分を持つ rb_build('{1,2,3}') && rb_build('{3,4,5}') true
= RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 BOOLEAN 等しい rb_build('{1,2,3}') = rb_build('{3,4,5}') false
<> RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 BOOLEAN 等しくない rb_build('{1,2,3}') <> rb_build('{3,4,5}') true

RoaringBitmap 関数

RoaringBitmap と RoaringBitmap64 の両方をサポートする関数

関数 入力タイプ 出力タイプ 説明 例 結果
rb_build_agg INTEGER | BIGINT RoaringBitmap | RoaringBitmap64 オフセットを RoaringBitmap に集約します。BIGINT 入力 (RoaringBitmap64 を返します) には V3.1 以降が必要です。 rb_build_agg(1) {1}
rb_cardinality RoaringBitmap | RoaringBitmap64 INTEGER RoaringBitmap の要素数を返します。 rb_cardinality(rb_build('{1,2,3,4,5}')) 5
rb_and_cardinality RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 INTEGER 2 つの RoaringBitmap の AND のカーディナリティを返します。 rb_and_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) 1
rb_or_cardinality RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 INTEGER 2 つの RoaringBitmap の OR のカーディナリティを返します。 rb_or_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) 5
rb_range RoaringBitmap | RoaringBitmap64, BIGINT, BIGINT RoaringBitmap | RoaringBitmap64 範囲 [start, end) 内の要素を返します。start は 1 ベースです。V1.3.16 以降が必要です。 rb_range(rb_build('{1,2,3}'), 2, 3) —
rb_minimum RoaringBitmap | RoaringBitmap64 INTEGER 最小のオフセットを返します。ビットマップが空の場合は -1 を返します。 rb_minimum(rb_build('{1,2,3}')) 1
rb_maximum RoaringBitmap | RoaringBitmap64 INTEGER 最大のオフセットを返します。ビットマップが空の場合は -1 を返します。 rb_maximum(rb_build('{1,2,3}')) 3
rb_to_array RoaringBitmap | RoaringBitmap64 INTEGER[] RoaringBitmap を整数配列に変換します。 rb_to_array(rb_build('{1,2,3}')) {1,2,3}
rb_to_array_string RoaringBitmap | RoaringBitmap64, TEXT TEXT 指定されたデリミタで要素を結合し、RoaringBitmap を文字列に変換します。 rb_to_array_string(rb_build('{1,2,3}'), ',') 1,2,3

RoaringBitmap64 のみをサポートする関数

関数 入力タイプ 出力タイプ 説明 例 結果
rb64_build BIGINT[] RoaringBitmap64 BIGINT 配列から 64 ビットの RoaringBitmap を作成します。V3.1 以降が必要です。 以下の例をご参照ください。 —
-- データを準備します。
CREATE TABLE public.tn (
    id INT,
    num BIGINT[]
);
INSERT INTO public.tn ("id", "num") VALUES (01, '{1,2}');

SELECT rb64_build(num) rb_num, num FROM public.tn;

想定される出力:

rb_num                                                                          | num
--------------------------------------------------------------------------------+------
\x030100000000000000000000003a30000001000000000001001000000001000200             | {1,2}

RoaringBitmap (32 ビット) のみをサポートする関数

関数 入力タイプ 出力タイプ 説明 例 結果
rb_build INTEGER[] RoaringBitmap 整数配列から 32 ビットの RoaringBitmap を作成します。 rb_build('{1,2,3,4,5}') {1,2,3,4,5}
roaringbitmap_in TEXT RoaringBitmap TEXT 形式でエンコードされた RoaringBitmap を RoaringBitmap 型に変換します。V2.1.33 以降が必要です。 以下の例をご参照ください。 —
rb_index RoaringBitmap, INTEGER BIGINT 要素の 0 ベースのインデックスを返します。要素が存在しない場合は -1 を返します。V1.3.16 以降が必要です。 rb_index(rb_build('{1,2,3}'), 3) 2
rb_and_null2empty RoaringBitmap, RoaringBitmap RoaringBitmap AND 演算。NULL 入力は空のビットマップとして扱います。V1.1.42 以降が必要です。 rb_and_null2empty(rb_build(null), rb_build('{3,4,5}')) {}
rb_or_null2empty RoaringBitmap, RoaringBitmap RoaringBitmap OR 演算。NULL 入力は空のビットマップとして扱います。V1.1.42 以降が必要です。 rb_or_null2empty(rb_build(null), rb_build('{3,4,5}')) {3,4,5}
rb_andnot_null2empty RoaringBitmap, RoaringBitmap RoaringBitmap ANDNOT 演算。NULL 入力は空のビットマップとして扱います。V1.1.42 以降が必要です。 rb_andnot_null2empty(rb_build(null), rb_build('{3,4,5}')) {}
rb_and_null2empty_cardinality RoaringBitmap, RoaringBitmap INTEGER AND カーディナリティを返します。NULL 入力は空のビットマップ ({}) として扱います。V1.1.42 以降が必要です。 rb_and_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) 0
rb_or_null2empty_cardinality RoaringBitmap, RoaringBitmap INTEGER OR カーディナリティを返します。NULL 入力は空のビットマップとして扱います。V1.1.42 以降が必要です。 rb_or_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) 3
rb_xor_cardinality RoaringBitmap, RoaringBitmap INTEGER 2 つの RoaringBitmap の XOR のカーディナリティを返します。 rb_xor_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) 4
rb_andnot_cardinality RoaringBitmap, RoaringBitmap INTEGER 2 つの RoaringBitmap の ANDNOT のカーディナリティを返します。 rb_andnot_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) 2
rb_andnot_null2empty_cardinality RoaringBitmap, RoaringBitmap INTEGER ANDNOT カーディナリティを返します。NULL 入力は空のビットマップとして扱います。V1.1.42 以降が必要です。 rb_andnot_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) 0
rb_is_empty RoaringBitmap BOOLEAN RoaringBitmap が空かどうかをチェックします。 rb_is_empty(rb_build('{1,2,3,4,5}')) false
rb_fill RoaringBitmap, BIGINT, BIGINT RoaringBitmap [start, end) のオフセットを埋めます。end は除きます。V1.3.16 以降が必要です。 rb_fill(rb_build('{1,2,3}'), 5, 7) {1,2,3,5,6}
rb_clear RoaringBitmap, BIGINT, BIGINT RoaringBitmap [start, end) のオフセットをクリアします。end は除きます。V1.3.16 以降が必要です。 rb_clear(rb_build('{1,2,3}'), 2, 3) —
rb_contains_bitmap RoaringBitmap, RoaringBitmap BOOLEAN 最初のビットマップが 2 番目のビットマップのすべての要素を含むかどうかをチェックします。 rb_contains_bitmap(rb_build('{1,2,3}'), rb_build('{3}')) true
rb_flip RoaringBitmap, INTEGER, INTEGER RoaringBitmap [start, end) の範囲のオフセットを反転させます。end は除きます。 rb_flip(rb_build('{1,2,3}'), 2, 3) —
rb_range_cardinality RoaringBitmap, BIGINT, BIGINT BIGINT [start, end) 内の要素のカーディナリティを返します。start は 1 ベースです。V1.3.16 以降が必要です。 rb_range_cardinality(rb_build('{1,2,3}'), 2, 3) —
rb_rank RoaringBitmap, INTEGER INTEGER 指定されたオフセット以下の要素数を返します。 rb_rank(rb_build('{1,2,3}'), 3) 3
rb_jaccard_dist RoaringBitmap, RoaringBitmap 倍精度 2 つの RoaringBitmap 間のジャカード距離を返します。V1.3.16 以降が必要です。 rb_jaccard_dist(rb_build('{1,2,3}'), rb_build('{3,4}')) 0.75
rb_select RoaringBitmap, bitset_limit BIGINT, bitset_offset BIGINT = 0, reverse BOOLEAN = false, range_start BIGINT = -2147483648, range_end BIGINT = 2147483647 RoaringBitmap [range_start, range_end) の範囲にある要素の中から、ランク (順位) に基づいて [bitset_offset] から [bitset_limit] 個の要素をサブセットとして返します。 rb_select(rb_build('{1,2,3,4,5,6,7,8,9}'), 5, 2) —
rb_iterate RoaringBitmap INTEGER のセット RoaringBitmap の各オフセットを行として返します。 rb_iterate(rb_build('{1,2,3}')) 1、2、3

roaringbitmap_in の例:

-- サンプルテーブルを作成します。
CREATE TABLE rb_text (
    id int,
    a text
);

-- データを挿入します。
INSERT INTO rb_text
    VALUES (1, '\x3a300000010000000000090010000000010002000300040005000600070008000900c800');

-- RoaringBitmap に変換し、カーディナリティを計算します。
SELECT
    rb_cardinality(roaringbitmap_in(a::cstring))
FROM
    rb_text;

想定される出力:

 rb_cardinality
----------------
             10

RoaringBitmap 集計関数

RoaringBitmap と RoaringBitmap64 の両方をサポートする関数

以下のすべての例では、複数行の入力を使用し、集約によって複数のビットマップがどのようにマージされるかを示します。

関数 入力タイプ 出力タイプ 説明 例 結果
rb_or_agg RoaringBitmap | RoaringBitmap64 入力と同じ すべての入力行に対する OR 集約。 以下の例をご参照ください。 —
rb_and_agg RoaringBitmap | RoaringBitmap64 入力と同じ すべての入力行に対する AND 集約。 以下の例をご参照ください。 —
rb_or_cardinality_agg RoaringBitmap | RoaringBitmap64 INTEGER OR 集約のカーディナリティを返します。 以下の例をご参照ください。 —
rb_and_cardinality_agg RoaringBitmap | RoaringBitmap64 INTEGER AND 集約のカーディナリティを返します。 以下の例をご参照ください。 —
-- OR 集約:すべての入力ビットマップの和集合を返します。
SELECT rb_or_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- 結果:{1,2,3,4}

-- AND 集約:すべての入力ビットマップの積集合を返します。
SELECT rb_and_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- 結果:{2,3}

-- OR カーディナリティ集約。
SELECT rb_or_cardinality_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- 結果:4

-- AND カーディナリティ集約。
SELECT rb_and_cardinality_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- 結果:2

RoaringBitmap (32 ビット) のみをサポートする関数

関数 入力タイプ 出力タイプ 説明 例 結果
rb_xor_agg RoaringBitmap RoaringBitmap すべての入力行に対する XOR 集約。 以下の例をご参照ください。 —
rb_xor_cardinality_agg RoaringBitmap INTEGER XOR 集約のカーディナリティを返します。 以下の例をご参照ください。 —
-- XOR 集約:奇数個の入力ビットマップに存在する要素を返します。
SELECT rb_xor_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- 結果:{1,4}

-- XOR カーディナリティ集約。
SELECT rb_xor_cardinality_agg(bitmap)
FROM (VALUES
    (rb_build('{1,2,3}')),
    (rb_build('{2,3,4}'))
) t(bitmap);
-- 結果:2

その他の RoaringBitmap 関数

以下の関数は、RoaringBitmap (32 ビット) 型のみをサポートします。

関数 入力タイプ 出力タイプ 説明 例 結果
roaringbitmap_text TEXT, BOOLEAN RoaringBitmap TEXT からバイナリ RoaringBitmap データを RoaringBitmap 構造にデシリアライズします。2 番目のパラメーターでフォーマット検証を制御します。無効なビットマップデータを回避するには、true に設定してください。 roaringbitmap_text(':0', true) —
rb_to_text RoaringBitmap TEXT RoaringBitmap 構造を TEXT 形式のバイナリ表現に変換します。 rb_to_text(rb_build('{1,2,3}')) \x3a300000...

例

次のエンドツーエンドの例では、拡張の有効化、テーブルの作成、データの挿入、ビットワイズ演算の実行、結果の確認までの一連のワークフローを示します。

  1. 拡張を有効にします。

    CREATE EXTENSION roaringbitmap;
  2. Roaring ビットマップデータを格納するテーブルを作成します。

    -- テーブル t1 を作成します。
    CREATE TABLE public.t1 (id integer, bitmap roaringbitmap);
  3. Roaring ビットマップデータを挿入します。

    -- 明示的な配列からビットマップを作成します。
    INSERT INTO public.t1 SELECT 1, RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]);
    
    -- 生成した連番を集計してビットマップを作成します。
    INSERT INTO public.t1 SELECT 2, RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
  4. ビットワイズ演算を実行します。

    -- 2 つのビットマップの OR を実行します。
    SELECT RB_OR(a.bitmap, b.bitmap)
    FROM (SELECT bitmap FROM public.t1 WHERE id = 1) AS a,
         (SELECT bitmap FROM public.t1 WHERE id = 2) AS b;

    想定される出力 ({1..9, 200} と {1..100} の和集合):

     rb_or
    -------
     {1,2,3,4,5,6,7,8,9,10,...,100,200}
  5. 集計操作を実行して、テーブル内のすべてのビットマップを結合します。

    SELECT RB_OR_AGG(bitmap)  FROM public.t1;  -- すべてのビットマップの和集合
    SELECT RB_AND_AGG(bitmap) FROM public.t1;  -- すべてのビットマップの積集合
    SELECT RB_XOR_AGG(bitmap) FROM public.t1;  -- 対称差
    SELECT RB_BUILD_AGG(id)   FROM public.t1;  -- id 列からビットマップを作成します。
  6. カーディナリティ (セットされたビット数) を計算します。

    SELECT RB_CARDINALITY(bitmap) FROM public.t1;

    想定される出力:

     id | rb_cardinality
    ----+----------------
      1 |             10
      2 |            100
  7. セットされたすべてのオフセットを一覧表示します。

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

    想定される出力:

     rb_iterate
    ------------
              1
              2
              3
              4
              5
              6
              7
              8
              9
            200
  8. Roaring ビットマップを配列に変換します。

    SELECT RB_TO_ARRAY(bitmap) FROM public.t1 WHERE id = 1;

    想定される出力:

               rb_to_array
    --------------------------------
     {1,2,3,4,5,6,7,8,9,200}