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... |
例
次のエンドツーエンドの例では、拡張の有効化、テーブルの作成、データの挿入、ビットワイズ演算の実行、結果の確認までの一連のワークフローを示します。
-
拡張を有効にします。
CREATE EXTENSION roaringbitmap; -
Roaring ビットマップデータを格納するテーブルを作成します。
-- テーブル t1 を作成します。 CREATE TABLE public.t1 (id integer, bitmap roaringbitmap); -
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; -
ビットワイズ演算を実行します。
-- 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} -
集計操作を実行して、テーブル内のすべてのビットマップを結合します。
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 列からビットマップを作成します。 -
カーディナリティ (セットされたビット数) を計算します。
SELECT RB_CARDINALITY(bitmap) FROM public.t1;想定される出力:
id | rb_cardinality ----+---------------- 1 | 10 2 | 100 -
セットされたすべてのオフセットを一覧表示します。
SELECT RB_ITERATE(bitmap) FROM public.t1 WHERE id = 1;想定される出力:
rb_iterate ------------ 1 2 3 4 5 6 7 8 9 200 -
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}