ビットマップコンストラクタは、新しいビットマップデータ型を構築するために使用されます。OceanBaseデータベースで現在サポートされているビットマップ関数には、rb_build()、rb_build_empty()、rb_build_varbinary()、および rb_from_string() があります。
説明
可視化された16進数のクエリ結果を理解するために必要な注意事項については、効率的な圧縮ビットマップ列の作成を参照してください。
rb_build
rb_build() 関数は、整数型の基本型を持つ配列データを効率的に圧縮されたビットマップデータ(RoaringBitmap)に変換するために使用されます。構文は以下のとおりです:
rb_build(arr)
入力パラメータの説明は以下のとおりです:
arrとして渡される型は配列型である必要があります。
戻り値は、配列のすべての要素を含むRoaringBitmapです。
制約事項は以下のとおりです:
- 配列には空要素を含めることはできません。
- 配列がネストされた配列の場合、各サブ配列の基本要素を再帰的に取り出し、Roaringbitmapに挿入します。
- Roaringbitmapは符号なし64ビット整数(uint64)と符号付き32ビット整数(int32)データの挿入をサポートしています。これは後述の
rb_from_stringの動作と一致しています。入力された符号付き32ビット整数の負数は、まず符号なし32ビット整数に変換された後、RoaringBitmapに挿入されます。したがって、許容される整数の範囲は、符号付き32ビット整数の最小値から符号なし64ビット整数の最大値、すなわち[INT32_MIN, UINT64_MAX]です。
例:
SELECT rb_to_string(rb_build([1.2]));
ERROR 5083 (22000): Invalid data type for the operation
SELECT rb_to_string(rb_build([0,1,2]));
+---------------------------------+
| rb_to_string(rb_build([0,1,2])) |
+---------------------------------+
| 0,1,2 |
+---------------------------------+
1 row in set
SELECT rb_to_string(rb_build([[0,1],[2],[2,3]]));
+-------------------------------------------+
| rb_to_string(rb_build([[0,1],[2],[2,3]])) |
+-------------------------------------------+
| 0,1,2,3 |
+-------------------------------------------+
1 row in set
rb_build_empty
rb_build_empty() 関数は、空のビットマップデータを構築するために使用されます。構文は以下のとおりです:
rb_build_empty()
この関数には入力パラメータが必要ありません。
例:
SELECT rb_build_empty();
+------------------------------------+
| rb_build_empty() |
+------------------------------------+
| 0x0100 |
+------------------------------------+
1 row in set
SELECT rb_is_empty(rb_build_empty());
+-------------------------------+
| rb_is_empty(rb_build_empty()) |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set
rb_build_varbinary
rb_build_varbinary() 関数は、varbinaryを使用してビットマップデータを構築します。VarbinaryはOceanBase独自の形式で、バージョン情報、タイプ情報、データなどの部分から構成されるバイナリ形式です。構文は以下のとおりです:
rb_build_varbinary(bin_str)
入力パラメータはvarbinary文字列です。
例:
SELECT rb_to_string(rb_build_varbinary(x'0100'));
+-------------------------------------------+
| rb_to_string(rb_build_varbinary(x'0100')) |
+-------------------------------------------+
| |
+-------------------------------------------+
1 row in set
SELECT rb_to_string(rb_build_varbinary(x'0103020100000002000000'));
+-------------------------------------------------------------+
| rb_to_string(rb_build_varbinary(x'0103020100000002000000')) |
+-------------------------------------------------------------+
| 1,2 |
+-------------------------------------------------------------+
1 row in set
rb_from_string
rb_from_string() 関数は、特定の形式の文字列を使用してビットマップデータを構築します。文字列は、構築するビットマップデータの各要素をカンマで区切って表現し、例えば 1,2,3,4 のようになります。構文は以下のとおりです:
rb_from_string(str)
入力される文字列値はINT32とINT64の2種類の形式をサポートしており、OceanBaseがサポートする有効な値の範囲は [0, UINT64_MAX] です。しかし、PGとの互換性のため、[INT32_MIN,0) の範囲の負の整数の入力もサポートしています。出力時には、負の整数はUINT32の値に変換して出力されます。例えば、入力が -1 の場合、出力は 4294967295 になります。
例:
SELECT rb_from_string('1,2,3');
+--------------------------------------------------+
| rb_from_string('1,2,3') |
+--------------------------------------------------+
| 0x010303010000000200000003000000 |
+--------------------------------------------------+
1 row in set
SELECT rb_to_string(rb_from_string('-1'));
+------------------------------------+
| rb_to_string(rb_from_string('-1')) |
+------------------------------------+
| 4294967295 |
+------------------------------------+
1 row in set
rb_select
ビットマップデータは一連の非負整数を格納します。rb_select() 関数は、指定された条件に基づいてビットマップデータの値から局所的な範囲を選択し、新しいビットマップデータとして保存してその値を返します。構文は以下のとおりです:
res_rb = rb_select(rb, limit [, offset] [, reverse] [, range_start] [, range_end])
パラメータの説明は以下のとおりです:
パラメータ |
データ型 |
デフォルト値 |
説明 |
必須 |
|---|---|---|---|---|
| rb | RoaringBitmap | 入力するビットマップデータ。 | はい | |
| limit | uint64 | 出力する要素数を制限します。 | はい | |
| offset | uint64 | 0 | 出力開始位置のオフセット量。 | いいえ |
| reverse | bool | false | 倒順で出力するかどうか。 | いいえ |
| range_start | uint64 | 0 | 出力範囲の開始値。 | いいえ |
| range_end | uint64 | UINT64_MAX | 出力範囲の終了値。 | いいえ |
計算手順は以下のとおりです:
範囲が指定されている場合、まず
[range_start,range_end)の範囲内にあるすべての要素をフィルタリングします。reverseがfalseの場合、値は昇順で選択されます。trueの場合は降順で選択されます。rb_select()関数は、reverseの方向に基づいて、フィルタリングされた要素から出力の開始位置を計算します。offsetを計算します。limitを計算します。範囲内のデータのうち、最大limit個を出力します。範囲内のデータがlimitより少ない場合は、範囲内のすべてのデータを出力します。
戻り値はビットマップデータ型です。
例:
'10, 20, 30, 40, 50, 60, 70' の最初の3つの値を返します:
SELECT rb_to_string(rb_select(rb_from_string('10, 20, 30, 40, 50, 60, 70'), 3));
+--------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('10, 20, 30, 40, 50, 60, 70'), 3)) |
+--------------------------------------------------------------------------+
| 10,20,30 |
+--------------------------------------------------------------------------+
1 row in set
2つの値をオフセットして、'1,2,3,4,5,6,7' の最初の2つの値を返します:
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 2));
+----------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 2)) |
+----------------------------------------------------------------+
| 3,4 |
+----------------------------------------------------------------+
1 row in set
[2, 6) の範囲から昇順で最初の2つの値を選択します:
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 0, false, 2, 6));
+-----------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 0, false, 2, 6)) |
+-----------------------------------------------------------------------------+
| 2,3 |
+-----------------------------------------------------------------------------+
1 row in set
範囲を [2, 6) に制限し、1つの値を降順にオフセットして結果を計算し、最終的に最初の2つの値を返します:
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 1, true, 2, 6));
+----------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 2, 1, true, 2, 6)) |
+----------------------------------------------------------------------------+
| 3,4 |
+----------------------------------------------------------------------------+
1 row in set
範囲を [2, 6) に制限し、1つの値を昇順にオフセットして結果を計算し、最終的に最初の10個の値を返します(実際には3つの値が返されます):
SELECT rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 10, 1, false, 2, 6));
+------------------------------------------------------------------------------+
| rb_to_string(rb_select(rb_from_string('1,2,3,4,5,6,7'), 10, 1, false, 2, 6)) |
+------------------------------------------------------------------------------+
| 3,4,5 |
+------------------------------------------------------------------------------+
1 row in set