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

Hologres:BSI 関数

最終更新日:Nov 06, 2025

このトピックでは、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を作成します。

SELECT bsi_iterate(bsi_build('{1,2,3}','{2,4,6}'));
{1,2}
{2,4}
{3,6}

bsi_add_value

bsi, integer, bigint

bsi

キーと値のペアをBSIに追加します。

SELECT bsi_iterate(bsi_add_value(bsi_build('{1,2,3}','{2,4,6}'),4,8));
{1,2}
{2,4}
{3,6}
{4,8}

BSI拡張関数

関数

入力データ型

出力データ型

説明

返される結果

bsi_iterate

bsi

set of integer[]

BSIをキーと値のペアに展開します。

SELECT bsi_iterate(bsi_build('{1,2,3}','{2,4,6}'));
{1,2}
{2,4}
{3,6}

bsi_show

bsi/bytea, integer

text

BSIをキーと値のペアに展開し、最初の N 個のキーと値のペアを表示します。Nは整数です。

SELECT bsi_show(bsi_build('{1,2,3}','{2,4,6}'),2);
1=2,2=4...left 1

BSIクエリ関数

関数

入力データ型

出力データ型

説明

返される結果

bsi_ebm

bsi/bytea

roaringbitmap

BSIのEBM配列のroaringビットマップをクエリします。

SELECT rb_to_array(bsi_ebm(bsi_build('{1,2,3}','{2,4,6}')));
{1,2,3}

bsi_eq

bsi, bigint [, bytea]

roaringbitmap

BSI型の最初の入力パラメーターがBIGINT型の2番目の入力パラメーターと等しい部分をクエリし、EBM配列のroaringビットマップを返します。

3番目の入力パラメーターが構成されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。

SELECT rb_to_array(bsi_eq(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{2,3}

bsi_filter

bsi/bytea, bytea

bsi

BSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリし、新しいBSIを返します。

SELECT bsi_iterate(bsi_filter(bsi_build('{1,2,3}','{2,4,6}'),rb_build('{1,2}')));
{1,2}
{2,4}

bsi_ge

bsi, bigint [, bytea]

roaringbitmap

BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値以上である部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。

3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。

SELECT rb_to_array(bsi_ge(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{2,3,4}

bsi_gt

bsi, bigint [, bytea]

roaringbitmap

BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値より大きい部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。

3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。

SELECT rb_to_array(bsi_gt(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{4}

bsi_le

bsi, bigint [, bytea]

roaringbitmap

BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値以下である部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。

3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。

SELECT rb_to_array(bsi_le(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{1,2,3}

bsi_lt

bsi, bigint [, bytea]

roaringbitmap

BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値より小さい部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。

3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。

SELECT rb_to_array(bsi_lt(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{1}

bsi_neq

bsi, bigint [, bytea]

roaringbitmap

BSI型の最初の入力パラメーター値のうち、BIGINT型の2番目の入力パラメーター値と等しくない部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。

3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。

SELECT rb_to_array(bsi_neq(bsi_build('{1,2,3,4}','{2,4,4,8}'),4));
{1,4}

bsi_range

bsi, bigint, bigint [, bytea]

roaringbitmap

BSI型の最初の入力パラメーターのうち、BIGINT型の2番目と3番目の入力パラメーター値の間にある部分をクエリし、EBM配列を含むroaringビットマップ型の値を返します。

3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから比較を実行します。

SELECT rb_to_array(bsi_range(bsi_build('{1,2,3,4}','{2,4,4,8}'),3,5));
{2,3}

bsi_compare

text, bsi, [bytea,] bigint, bigint

roaringbitmap

BSIを比較してフィルタリングします。

  • TEXT型の最初の入力パラメーターは、比較タイプを指定します。有効な値:LT、LE、GT、GE、EQ、NEQ、RANGE。

  • 3番目のパラメーターはBYTEA型で、オプションです。3番目のパラメーターは、BSIをフィルタリングするために使用されます。

  • BIGINT型の4番目と5番目のパラメーターは、比較の値を指定します。BIGINT型の2つの入力パラメーターは、RANGEベースの比較にのみ必要です。

SELECT rb_to_array(bsi_compare('RANGE',bsi_build('{1,2,3,4}','{2,4,4,8}'),3,5));
{2,3}

BSI集計関数と分析関数

関数

入力データ型

出力データ型

説明

返される結果

bsi_add

bsi, bsi

bsi

BSI型の2つの入力パラメーターの同じEBM配列をクエリし、EBM配列の値を追加してから、新しいBSIを返します。

SELECT bsi_iterate(bsi_add(bsi_build('{1,2,3}','{2,4,6}'),bsi_build('{1,2}','{2,4}')));
{1,4}
{2,8}
{3,6}

bsi_add_agg

bsi

bsi

加算と集計操作を実行します。

SELECT bsi_iterate(bsi_add_agg(bsi_build('{1,2,3}','{2,4,6}')));
{1,2}
{2,4}
{3,6}

bsi_merge

bsi, bsi

bsi

2つのBSIをマージします。2つのBSIのEBM配列には共通部分がありません。

SELECT bsi_iterate(bsi_merge(bsi_build('{1,2}','{2,4}'),bsi_build('{3,4}','{6,8}')));
{1,2}
{2,4}
{3,6}
{4,8}

bsi_merge_agg

bsi

bsi

集計結果をマージします。入力BSIのEBM配列には共通部分がありません。

SELECT bsi_iterate(bsi_merge_agg(bsi_build('{1,2,3}','{2,4,6}')));
{1,2}
{2,4}
{3,6}

bsi_stat

bigint[], bsi/bytea [, bytea]

text

BSI値の分布統計をクエリします。分布間隔は、入力境界値配列に基づいて分割されます。

3番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の2番目の入力パラメーターのEBM配列とBYTEA型の3番目の入力パラメーターの共通部分をクエリしてから、分布統計をクエリします。

SELECT bsi_stat('{1,3,5}',bsi_build('{1,2,3,4}','{2,4,6,8}'));
(0,1]=0;(1,3]=1;(3,5]=1;(5,8]=2

bsi_sum

bsi/bytea [, bytea]

bigint[]

BSI値の合計とEBMカーディナリティを含む配列を返します。

2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから、合計とカーディナリティを計算します。

SELECT bsi_sum(bsi_build('{1,2,3,4}','{2,4,6,8}'));
{20,4}

bsi_topk

bsi/bytea, [bytea, ] integer

roaringbitmap

上位 K 個の最大BSI値に対応するEBM配列をクエリし、EBM配列で構成されるroaringビットマップを返します。

2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから、上位 K 個の最大BSI値を計算します。

SELECT rb_to_array(bsi_topk(bsi_build('{1,2,3,4,5}','{2,4,6,8,10}'),3));
{3,4,5}

bsi_transpose

bsi/bytea [, bytea]

roaringbitmap

BSIの転置結果を返します。これは、重複排除後のroaringビットマップ型の値です。

2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから転置を実行します。

SELECT rb_to_array(bsi_transpose(bsi_build('{1,2,3,4,5}','{2,4,4,8,8}')));
{2,4,8}

bsi_transpose_with_count

bsi/bytea [, bytea]

bsi

BSI型の値を転置し、統計を収集して、新しいBSIを返します。

2番目の入力パラメーターが指定されており、roaringビットマップ型からシリアル化されたBYTEA型である場合、この関数はBSI型の最初の入力パラメーターのEBM配列とBYTEA型の2番目の入力パラメーターの共通部分をクエリしてから、転置を実行し、統計を収集します。

SELECT bsi_iterate(bsi_transpose_with_count(bsi_build('{1,2,3,4,5}','{2,4,4,8,8}')));
{2,1}
{4,2}
{8,2}