このトピックでは、Hologresでビットスライスインデックス(BSI)関数を使用する方法について説明します。BSI関数は、Hologresの拡張関数です。
仕組み
BSI 技術は、cid::int, value::bigint 形式のキーと値のペアを圧縮するために使用されます。次の表は、BSI の原理と構造をよりよく理解するためのサンプルデータです。
cid | 値(10進数) | 値(2進数) |
1 | 3 | 0011 |
2 | 6 | 0110 |
3 | 4 | 0100 |
4 | 10 | 1010 |
5 | 7 | 0111 |
6 | NULL | - |
サンプルテーブルには、cid列と2つの値列が含まれています。最大10進値は 10 で、4ビットの2進値に相当します。すべての10進値は4ビットの2進値に変換されます。2進データは、下位ビットから上位ビットへと走査されます。ビット値が 1 である各cid配列のroaringビットマップが記録され、BSI が形成されます。サンプルデータに基づいて、次のスライスを持つBSIが生成されます。
スライス 0:roaringbitmap '{1,5}'
スライス 1:roaringbitmap '{1,2,4,5}'
スライス 2:roaringbitmap '{2,3,5}'
スライス 3:roaringbitmap '{4}'
BSIには、次の情報も含まれています。
存在ビットマップ(EBM):空でないcid配列を格納するroaringビットマップ。この例では、roaringbitmap '{1,2,3,4,5}' が使用されます。
最大値:最大値。この例では、値は 10 です。
最小値:最小値。この例では、値は 3 です。
bitCount:10進値から変換された2進値のビット数。この例では、値は 4 です。
roaringビットマップを使用してサンプルデータに対してビットマップ操作を実行し、クラウドの選択結果がcrowd='{1,3,5}'である場合、BSI関数を使用して計算結果をすばやく取得できます。例:
選択されたクラウドの値の合計を計算します:
rb_and_cardinality(crowd, slice0) × 2<sup>0</sup> + ... + rb_and_cardinality(crowd, slice3) × 2<sup>3</sup> = 14選択したクラウドの上位2つの値を計算します。
crowd & slice3 = NULL crowd & slice2 = {3,5} -- 上位 2 つの値は {3,5} です。 {3,5} & slice1 = {5} -- 上位 1 つの値は {5} です。
BSIアルゴリズムを使用して、キーと値のペアを圧縮して保存できます。cidのroaringビットマップ計算と値の計算を組み合わせることで、属性タグと行動タグの両方を使用するユーザープロファイル分析シナリオの計算効率が向上します。BSI関数に基づくユーザープロファイル分析の詳細については、「BSI(ベータ版)」をご参照ください。
制限事項
BSI関数は、Hologres V2.1以降でのみサポートされています。Hologresインスタンスのバージョンが V2.1 より前の場合は、インスタンスをアップグレードしてください。詳細については、「インスタンスのアップグレード」をご参照ください。
BSI 関数の各値は、1 から 231 - 1 までの整数である必要があります。
スーパーユーザーは、次のステートメントを実行して2つの拡張機能を作成する必要があります。拡張機能はデータベースレベルで作成する必要があります。データベースごとに拡張機能を作成する必要があるのは1回だけです。
-- 拡張機能を作成します。BSI を作成する前に、roaring bitmap を作成する必要があります。 CREATE EXTENSION roaringbitmap; CREATE EXTENSION bsi; -- 拡張機能を削除します。 DROP EXTENSION bsi; DROP EXTENSION roaringbitmap;重要DROP EXTENSION <extension_name> CASCADE;文を実行して拡張機能を削除しないことをお勧めします。CASCADE 文は、指定された拡張機能だけでなく、拡張機能のデータと拡張機能に依存するオブジェクトも削除します。拡張機能データには、PostGIS データ、roaring bitmap データ、Proxima データ、バイナリログデータ、および BSI データが含まれます。オブジェクトには、メタデータ、テーブル、ビュー、およびサーバーデータが含まれます。
関数
BSIコンストラクター
関数 | 入力データ型 | 出力データ型 | 説明 | 例 | 返される結果 |
bsi_build | integer[], bigint[] | bsi | 2つの1次元データエントリに基づいてBSIを作成します。 | | |
bsi_add_value | bsi, integer, bigint | bsi | キーと値のペアをBSIに追加します。 | | |
BSI拡張関数
関数 | 入力データ型 | 出力データ型 | 説明 | 例 | 返される結果 |
bsi_iterate | bsi | set of integer[] | BSIをキーと値のペアに展開します。 | | |
bsi_show | bsi/bytea, integer | text | BSIをキーと値のペアに展開し、最初の N 個のキーと値のペアを表示します。Nは整数です。 | | |
BSIクエリ関数
関数 | 入力データ型 | 出力データ型 | 説明 | 例 | 返される結果 |
bsi_ebm | bsi/bytea | roaringbitmap | BSIのEBM配列のroaringビットマップをクエリします。 | | |
bsi_eq | bsi, bigint [, bytea] | roaringbitmap | BSI型の最初の入力パラメーターがBIGINT型の2番目の入力パラメーターと等しい部分をクエリし、EBM配列のroaringビットマップを返します。 3番目の入力パラメーターが構成されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。 | | |
bsi_filter | bsi/bytea, bytea | bsi | BSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリし、新しいBSIを返します。 | | |
bsi_ge | bsi, bigint [, bytea] | roaringbitmap | BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値以上である部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。 3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。 | | |
bsi_gt | bsi, bigint [, bytea] | roaringbitmap | BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値より大きい部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。 3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。 | | |
bsi_le | bsi, bigint [, bytea] | roaringbitmap | BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値以下である部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。 3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。 | | |
bsi_lt | bsi, bigint [, bytea] | roaringbitmap | BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値より小さい部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。 3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。 | | |
bsi_neq | bsi, bigint [, bytea] | roaringbitmap | BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値と等しくない部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。 3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。 | | |
bsi_range | bsi, bigint, bigint [, bytea] | roaringbitmap | BSI型の最初の入力パラメーターのうち、BIGINT型の2番目と3番目の入力パラメーター値の間にある部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。 3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。 | | |
bsi_compare | text, bsi, [bytea,] bigint, bigint | roaringbitmap | BSIを比較してフィルタリングします。
| | |
BSI集計関数と分析関数
関数 | 入力データ型 | 出力データ型 | 説明 | 例 | 返される結果 |
bsi_add | bsi, bsi | bsi | BSI型の2つの入力パラメーターの同じEBM配列をクエリし、EBM配列の値を追加してから、新しいBSIを返します。 | | |
bsi_add_agg | bsi | bsi | 加算と集計操作を実行します。 | | |
bsi_merge | bsi, bsi | bsi | 2つのBSIをマージします。2つのBSIのEBM配列には共通部分がありません。 | | |
bsi_merge_agg | bsi | bsi | 集計結果をマージします。入力BSIのEBM配列には共通部分がありません。 | | |
bsi_stat | bigint[], bsi/bytea [, bytea] | text | BSI値の分布統計をクエリします。分布間隔は、入力境界値配列に基づいて分割されます。 3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の2番目の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから、分布統計をクエリします。 | | |
bsi_sum | bsi/bytea [, bytea] | bigint[] | BSI値の合計とEBMカーディナリティを含む配列を返します。 2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから、合計とカーディナリティを計算します。 | | |
bsi_topk | bsi/bytea, [bytea, ] integer | roaringbitmap | 上位 K 個の最大BSI値に対応するEBM配列をクエリし、EBM配列で構成されるroaringビットマップを返します。 2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから、上位 K 個の最大BSI値を計算します。 | | |
bsi_transpose | bsi/bytea [, bytea] | roaringbitmap | BSIの転置結果を返します。これは、重複排除後のroaringビットマップ型の値です。 2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから転置を実行します。 | | |
bsi_transpose_with_count | bsi/bytea [, bytea] | bsi | BSI型の値を転置し、統計を収集して、新しいBSIを返します。 2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから、転置を実行し、統計を収集します。 | | |