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

PolarDB:pg_roaringbitmap 拡張の使用

最終更新日:Aug 25, 2026

pg_roaringbitmap 拡張は、PolarDB for PostgreSQL に roaringbitmap データ型を追加し、SQL で直接効率的なビットマップ操作を可能にします。ロアリングビットマップは、WAH、EWAH、Concise などの従来の圧縮ビットマップ形式よりもパフォーマンスが優れており、一部のシナリオではインデキシング速度が数百倍にもなり、非圧縮ビットマップよりもさらに高速です。

一般的なユースケース: 大規模な環境における、ユーザーセグメンテーション、タグベースのフィルタリング、重複排除、およびセットメンバーシップクエリ。

前提条件

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

  • PolarDB for PostgreSQL インスタンス

  • ターゲットデータベースで CREATE EXTENSION を実行する権限

拡張の有効化

CREATE EXTENSION IF NOT EXISTS roaringbitmap;

インストールを検証します。

SELECT extname, extversion FROM pg_extension WHERE extname = 'roaringbitmap';

出力例:

    extname    | extversion
---------------+------------
 roaringbitmap | 0.5
(1 行)

クイックスタート

以下の手順では、テーブル作成、ビットマップデータの挿入、計算の実行、結果取得という一連のワークフローを説明します。

ステップ 1: roaringbitmap カラムを持つテーブルを作成します。

CREATE TABLE t1 (id integer, bitmap roaringbitmap);

ステップ 2:ビットマップデータを挿入します。

-- rb_build: 整数配列で指定された位置のビットをセットします
INSERT INTO t1 SELECT 1, rb_build(ARRAY[1,2,3,4,5,6,7,8,9,200]);

-- rb_build_agg: 複数の行の値を単一のビットマップに集計し、
-- 各行の値ごとにビットをセットします
INSERT INTO t1 SELECT 2, rb_build_agg(e) FROM generate_series(1,100) e;

ステップ 3:ビットマップ演算 (OR、AND、XOR、ANDNOT) を実行します。

SELECT roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}');  -- OR
SELECT roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}');  -- AND
SELECT roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}');  -- XOR
SELECT roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}');  -- ANDNOT

ステップ 4:ビットマップの集計を実行します。

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;

ステップ 5:カーディナリティ (セットビットの数) を取得します。

SELECT rb_cardinality('{1,2,3}');

ステップ 6:ビットマップに格納された整数値を取得します。

-- 整数配列に変換します
SELECT rb_to_array(bitmap) FROM t1 WHERE id = 1;

-- 行のセットに展開します
SELECT unnest(rb_to_array('{1,2,3}'::roaringbitmap));

-- または、rb_iterate を使用することもできます
SELECT rb_iterate('{1,2,3}'::roaringbitmap);

入出力フォーマット

PolarDB は、入出力フォーマットとして array と bytea をサポートしています。

入力

-- 配列入力
SELECT roaringbitmap('{1,100,10}');
--                    roaringbitmap
-- ------------------------------------------------
--  \x3a30000001000000000002001000000001000a006400

-- bytea 入力
SELECT '\x3a30000001000000000002001000000001000a006400'::roaringbitmap;
--                    roaringbitmap
-- ------------------------------------------------
--  \x3a30000001000000000002001000000001000a006400

出力

デフォルトの出力フォーマットは bytea です。フォーマットを切り替えるには、roaringbitmap.output_format を使用します。

-- 配列出力に切り替えます
SET roaringbitmap.output_format = 'array';
SELECT '{1}'::roaringbitmap;
--  roaringbitmap
-- ---------------
--  {1}

-- bytea 出力に戻します
SET roaringbitmap.output_format = 'bytea';
SELECT '{1}'::roaringbitmap;
--              roaringbitmap
-- ----------------------------------------
--  \x3a3000000100000000000000100000000100

演算子

出力型が bool の場合を除き、すべての演算子は roaringbitmap を返します。

演算子

入力

出力

説明

例

結果

&

roaringbitmap, roaringbitmap

roaringbitmap

ビット単位 AND

roaringbitmap('{1,2,3}') & roaringbitmap('{3,4,5}')

{3}

|

roaringbitmap, roaringbitmap

roaringbitmap

ビット単位 OR

roaringbitmap('{1,2,3}') | roaringbitmap('{3,4,5}')

{1,2,3,4,5}

|

roaringbitmap, integer

roaringbitmap

要素の追加

roaringbitmap('{1,2,3}') | 6

{1,2,3,6}

|

integer, roaringbitmap

roaringbitmap

要素の追加

6 | roaringbitmap('{1,2,3}')

{1,2,3,6}

#

roaringbitmap, roaringbitmap

roaringbitmap

ビット単位 XOR

roaringbitmap('{1,2,3}') # roaringbitmap('{3,4,5}')

{1,2,4,5}

<<

roaringbitmap, bigint

roaringbitmap

各要素から値を減算

roaringbitmap('{1,2,3}') << 2

{0,1}

>>

roaringbitmap, bigint

roaringbitmap

各要素に値を追加

roaringbitmap('{1,2,3}') >> 3

{4,5,6}

-

roaringbitmap, roaringbitmap

roaringbitmap

ANDNOT (差集合)

roaringbitmap('{1,2,3}') - roaringbitmap('{3,4,5}')

{1,2}

-

roaringbitmap, integer

roaringbitmap

要素の削除

roaringbitmap('{1,2,3}') - 3

{1,2}

@>

roaringbitmap, roaringbitmap

bool

包含

roaringbitmap('{1,2,3}') @> roaringbitmap('{3,4,5}')

f

@>

roaringbitmap, integer

bool

要素の包含

roaringbitmap('{1,2,3,4,5}') @> 3

t

@>

roaringbitmap, integer

bool

要素の包含

roaringbitmap('{1,2,3}') @> 4

f

@>

integer, roaringbitmap

bool

包含

3 @> roaringbitmap('{1,2,3,4,5}')

f

&&

roaringbitmap, roaringbitmap

bool

交差 (論理積)

roaringbitmap('{1,2,3}') && roaringbitmap('{3,4,5}')

t

=

roaringbitmap, roaringbitmap

bool

等価

roaringbitmap('{1,2,3}') = roaringbitmap('{3,4,5}')

f

<>

roaringbitmap, roaringbitmap

bool

非等価

roaringbitmap('{1,2,3}') <> roaringbitmap('{3,4,5}')

t

関数

機能関数

関数

入力

出力

説明

例

結果

rb_build

integer[]

roaringbitmap

整数配列からビットマップを作成します。

rb_build('{1,2,3,4,5}')

{1,2,3,4,5}

rb_index

roaringbitmap, integer

bigint

要素の 0 から始まるインデックスを返します。要素が存在しない場合は -1 を返します。

rb_index('{1,2,3}', 3)

2

rb_cardinality

roaringbitmap

bigint

カーディナリティを返します。

rb_cardinality('{1,2,3,4,5}')

5

rb_and_cardinality

roaringbitmap, roaringbitmap

bigint

2 つのビットマップの AND 演算結果のカーディナリティです。

rb_and_cardinality('{1,2,3}', rb_build('{3,4,5}'))

1

rb_or_cardinality

roaringbitmap, roaringbitmap

bigint

2 つのビットマップの OR 演算結果のカーディナリティです。

rb_or_cardinality('{1,2,3}', '{3,4,5}')

5

rb_xor_cardinality

roaringbitmap, roaringbitmap

bigint

2 つのビットマップの XOR 演算結果のカーディナリティです。

rb_xor_cardinality('{1,2,3}', '{3,4,5}')

4

rb_andnot_cardinality

roaringbitmap, roaringbitmap

bigint

2 つのビットマップの ANDNOT 演算結果のカーディナリティです。

rb_andnot_cardinality('{1,2,3}', '{3,4,5}')

2

rb_is_empty

roaringbitmap

boolean

ビットマップが空かどうかをチェックします。

rb_is_empty('{1,2,3,4,5}')

f

rb_fill

roaringbitmap, range_start bigint, range_end bigint

roaringbitmap

範囲 [range_start, range_end) 内のすべての整数を追加します。

rb_fill('{1,2,3}', 5, 7)

{1,2,3,5,6}

rb_clear

roaringbitmap, range_start bigint, range_end bigint

roaringbitmap

範囲 [range_start, range_end) 内のすべての整数を削除します。

rb_clear('{1,2,3}', 2, 3)

{1,3}

rb_flip

roaringbitmap, range_start bigint, range_end bigint

roaringbitmap

範囲 [range_start, range_end) 内のすべてのビットを反転します。

rb_flip('{1,2,3}', 2, 10)

{1,4,5,6,7,8,9}

rb_range

roaringbitmap, range_start bigint, range_end bigint

roaringbitmap

範囲 [range_start, range_end) 内の要素を返します。

rb_range('{1,2,3}', 2, 3)

{2}

rb_range_cardinality

roaringbitmap, range_start bigint, range_end bigint

bigint

範囲 [range_start, range_end) 内の要素のカーディナリティです。

rb_range_cardinality('{1,2,3}', 2, 3)

1

rb_min

roaringbitmap

integer

最小の要素です。空の場合は NULL を返します。

rb_min('{1,2,3}')

1

rb_max

roaringbitmap

integer

最大の要素です。空の場合は NULL を返します。

rb_max('{1,2,3}')

3

rb_rank

roaringbitmap, integer

bigint

指定された値以下の要素数を返します。

rb_rank('{1,2,3}', 3)

3

rb_jaccard_dist

roaringbitmap, roaringbitmap

倍精度

2 つのビットマップのジャカード類似係数です。

rb_jaccard_dist('{1,2,3}', '{3,4}')

0.25

rb_select

roaringbitmap, bitset_limit bigint, bitset_offset bigint=0, reverse boolean=false, range_start bigint=0, range_end bigint=4294967296

roaringbitmap

範囲 [range_start, range_end) 内の要素のうち、サブセット [bitset_offset, bitset_offset + bitset_limit) を返します。

rb_select('{1,2,3,4,5,6,7,8,9}', 5, 2)

{3,4,5,6,7}

rb_to_array

roaringbitmap

integer[]

整数配列に変換します。

rb_to_array(roaringbitmap('{1,2,3}'))

{1,2,3}

rb_iterate

roaringbitmap

SET of integer

要素を行セットとして返します。

SELECT rb_iterate(rb_build('{1,2,3}'))

1, 2, 3

集計関数

関数

入力

出力

説明

例

結果

rb_build_agg

integer

roaringbitmap

整数の行セットからビットマップを構築します。

SELECT rb_build_agg(id) FROM (VALUES (1),(2),(3)) t(id)

{1,2,3}

rb_or_agg

roaringbitmap

roaringbitmap

ビットマップのセットに対して OR 集計を実行します。

SELECT rb_or_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)

{1,2,3,4}

rb_and_agg

roaringbitmap

roaringbitmap

ビットマップのセットに対して AND 集計を実行します。

SELECT rb_and_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)

{2,3}

rb_xor_agg

roaringbitmap

roaringbitmap

ビットマップのセットに対して XOR 集計を実行します。

SELECT rb_xor_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)

{1,4}

rb_or_cardinality_agg

roaringbitmap

bigint

OR 集計を実行し、カーディナリティを返します。

SELECT rb_or_cardinality_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)

4

rb_and_cardinality_agg

roaringbitmap

bigint

AND 集計を実行し、カーディナリティを返します。

SELECT rb_and_cardinality_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)

2

rb_xor_cardinality_agg

roaringbitmap

bigint

XOR 集計を実行し、カーディナリティを返します。

SELECT rb_xor_cardinality_agg(bitmap) FROM (VALUES (roaringbitmap('{1,2,3}')), (roaringbitmap('{2,3,4}'))) t(bitmap)

2