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, roaringbitmap | roaringbitmap | ビット単位 OR |
|
|
| roaringbitmap, integer | roaringbitmap | 要素の追加 |
|
|
| integer, roaringbitmap | roaringbitmap | 要素の追加 |
|
|
| roaringbitmap, roaringbitmap | roaringbitmap | ビット単位 XOR |
|
|
| roaringbitmap, bigint | roaringbitmap | 各要素から値を減算 |
|
|
| roaringbitmap, bigint | roaringbitmap | 各要素に値を追加 |
|
|
| roaringbitmap, roaringbitmap | roaringbitmap | ANDNOT (差集合) |
|
|
| roaringbitmap, integer | roaringbitmap | 要素の削除 |
|
|
| roaringbitmap, roaringbitmap | bool | 包含 |
|
|
| roaringbitmap, integer | bool | 要素の包含 |
|
|
| roaringbitmap, integer | bool | 要素の包含 |
|
|
| integer, roaringbitmap | bool | 包含 |
|
|
| roaringbitmap, roaringbitmap | bool | 交差 (論理積) |
|
|
| roaringbitmap, roaringbitmap | bool | 等価 |
|
|
| roaringbitmap, roaringbitmap | bool | 非等価 |
|
|
関数
機能関数
関数 | 入力 | 出力 | 説明 | 例 | 結果 |
| integer[] | roaringbitmap | 整数配列からビットマップを作成します。 |
|
|
| roaringbitmap, integer | bigint | 要素の 0 から始まるインデックスを返します。要素が存在しない場合は -1 を返します。 |
|
|
| roaringbitmap | bigint | カーディナリティを返します。 |
|
|
| roaringbitmap, roaringbitmap | bigint | 2 つのビットマップの AND 演算結果のカーディナリティです。 |
|
|
| roaringbitmap, roaringbitmap | bigint | 2 つのビットマップの OR 演算結果のカーディナリティです。 |
|
|
| roaringbitmap, roaringbitmap | bigint | 2 つのビットマップの XOR 演算結果のカーディナリティです。 |
|
|
| roaringbitmap, roaringbitmap | bigint | 2 つのビットマップの ANDNOT 演算結果のカーディナリティです。 |
|
|
| roaringbitmap | boolean | ビットマップが空かどうかをチェックします。 |
|
|
| roaringbitmap, range_start bigint, range_end bigint | roaringbitmap | 範囲 [range_start, range_end) 内のすべての整数を追加します。 |
|
|
| roaringbitmap, range_start bigint, range_end bigint | roaringbitmap | 範囲 [range_start, range_end) 内のすべての整数を削除します。 |
|
|
| roaringbitmap, range_start bigint, range_end bigint | roaringbitmap | 範囲 [range_start, range_end) 内のすべてのビットを反転します。 |
|
|
| roaringbitmap, range_start bigint, range_end bigint | roaringbitmap | 範囲 [range_start, range_end) 内の要素を返します。 |
|
|
| roaringbitmap, range_start bigint, range_end bigint | bigint | 範囲 [range_start, range_end) 内の要素のカーディナリティです。 |
|
|
| roaringbitmap | integer | 最小の要素です。空の場合は NULL を返します。 |
|
|
| roaringbitmap | integer | 最大の要素です。空の場合は NULL を返します。 |
|
|
| roaringbitmap, integer | bigint | 指定された値以下の要素数を返します。 |
|
|
| roaringbitmap, roaringbitmap | 倍精度 | 2 つのビットマップのジャカード類似係数です。 |
|
|
| 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) を返します。 |
|
|
| roaringbitmap | integer[] | 整数配列に変換します。 |
|
|
| roaringbitmap | SET of integer | 要素を行セットとして返します。 |
|
|
集計関数
関数 | 入力 | 出力 | 説明 | 例 | 結果 |
| integer | roaringbitmap | 整数の行セットからビットマップを構築します。 |
|
|
| roaringbitmap | roaringbitmap | ビットマップのセットに対して OR 集計を実行します。 |
|
|
| roaringbitmap | roaringbitmap | ビットマップのセットに対して AND 集計を実行します。 |
|
|
| roaringbitmap | roaringbitmap | ビットマップのセットに対して XOR 集計を実行します。 |
|
|
| roaringbitmap | bigint | OR 集計を実行し、カーディナリティを返します。 |
|
|
| roaringbitmap | bigint | AND 集計を実行し、カーディナリティを返します。 |
|
|
| roaringbitmap | bigint | XOR 集計を実行し、カーディナリティを返します。 |
|
|