他のバージョンの文書 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

64.5. BRINインデックス #

64.5.1. はじめに #

BRINは「ブロックレンジインデックス」(Block Range Index)の略です。 BRINは、ある列がテーブル内の物理的な位置と自然な相関があるような、非常に大規模なテーブルのために設計されています。

BRINブロックレンジ(block range)(またはページレンジ(page range))として動作します。 ブロックレンジ(block range)は、テーブル内で物理的に隣接するページのグループです。それぞれのブロックレンジに対して、ある種の要約情報がインデックス内に格納されます。 たとえば、店舗の受注情報を格納するテーブルは、各々の受注時期を格納する日付列を持つでしょう。大抵の場合、より前の受注エントリは、テーブルのより前の方にあるでしょう。 郵便番号を管理するテーブルでは、ある市に属する郵便番号が自然にグループ化されることになるでしょう。

BRINインデックスは、通常のビットマップインデックススキャンを通じて要求されるクエリに使用することができます。 すなわち、インデックス内のレンジ要約情報が検索条件と一致すれば、BRINインデックスは各レンジ内のすべてのページにあるすべてのタプルを返します。 クエリエグゼキュータの役割は、検索条件を再チェックし、条件に合致しないタプルを捨てることです。 つまり言い換えると、BRINインデックスには損失性があります。 BRINインデックスは非常に小さいため、それに対するスキャンはシーケンシャルスキャンに比べると小さなオーバーヘッドしか与えません。しかし、あらかじめ条件に合致しないと分かっているテーブルの多くの部分をスキャンすることを避けることができます。

BRINインデックスに格納される特定のデータと、そのインデックスが対応できる特定のクエリは、インデックスに対応する各々の列に与えられた演算子クラスに依存します。 線形のソート順を持つデータ型は、ブロックレンジ内の最小値と最大値と格納する演算子クラスを持つことができます。 たとえば、幾何データ型は、ブロックレンジ内のすべてのオブジェクトを含む外接矩形を持つことでしょう。

ブロックレンジの大きさは、ストレージパラメータpages_per_rangeでインデックス作成時に決定されます。 インデックスエントリの数は、リレーションのページ数をpages_per_rangeに設定した数で割ったものと等しくなります。 ですから、pages_per_rangeの設定値が小さいほど、インデックスは大きくなります(より多くのインデックスエントリを格納する必要があるので)が、反面、格納されたサマリデータはより精密になり、インデックススキャンの際により多くのデータブロックをスキップすることができるようになります。

64.5.1.1. インデックスの保守 #

インデックスを作成した当初は、すべてのヒープページがスキャンされ、終端が不完全なものも含め、各々のレンジに対してサマリインデックスタプルが作成されます。 新しいページにデータが登録されると、新しいタプルのデータを元に、すでにサマリ済みのページレンジのサマリ情報が更新されます。 最終サマリレンジに適合しない新しいページが作成されると、そのレンジに対して自動的にはサマリタプルが作成されません。 これらのタプルは、後でサマリ処理が走って初期サマリ情報が作成されるまではサマリされません。

ページレンジの初期サマリ処理を起動する複数の方法があります。 手動あるいはautovacuumのどちらでも良いですが、テーブルがバキュームされるとすべてのまだサマライズされていないページレンジがサマライズされます。 また、インデックスのautosummarizeパラメータが有効なら、これはデフォルトでは有効ではありませんが、そのデータベースに対してバキュームが実行されると、自動バキュームによってそのテーブル自体が処理されるかどうかにかかわらず、すべての挿入された未サマリページレンジに対してサマリ処理が実行されます。 以下を見てください。

最後に、次の関数を使用できます(これらの関数の実行中、search_pathは一時的にpg_catalog, pg_tempに変更されます)。

すべての未サマリレンジをサマライズするbrin_summarize_new_values(regclass)
もしまだサマライズされていなければ、指定されたページを含む指定されたレンジのみをサマライズするbrin_summarize_range(regclass, bigint)

自動サマリ機能が有効な場合、次のブロックレンジの最初のページの最初の項目の挿入が検出されると、同じデータベースで実行中の自動バキュームワーカーの次の実行の終了時に処理されるブロックレンジをターゲットとするサマリ機能を実行する要求がautovacuumに送信されます。 もしリクエストキューが満杯ならばそのリクエストは記録されず、次のメッセージがサーバのログに送信されます。

LOG:  request for BRIN range summarization for index "brin_wi_idx" page 128 was not recorded

この状態が発生すると、テーブルの次の通常バキュームが実行されるか、上で述べた関数のどれかが実行されるまでは、そのレンジはサマライズされない状態にとどまります。

反対に、レンジはbrin_desummarize_range(regclass, bigint)関数で非サマリ化できます。 これは、既存の値が変更されたためにインデックスタプルがもはや値の表現としては適当でなくなった場合に有効です。 詳細は9.28.8を見てください。

64.5.2. 組み込み演算子クラス #

PostgreSQLのコア配布物には、表 64.4で示されるBRIN演算子クラスが含まれます。

minmax演算子クラスは、インデックスが貼られた列の範囲内に現れる最小値と最大値を格納します。 inclusion演算子クラスは、インデックスが貼られた列の範囲内に含まれる値を格納します。 bloom演算子クラスは、その範囲内のすべての値に対してブルームフィルタを構築します。 minmax-multi演算子クラスは、インデックスが貼られた列の範囲内に現れる複数の最小値と最大値、代表値を格納します。

表64.4 組み込みBRIN演算子クラス

名前インデックス可能な演算子
bit_minmax_ops= (bit,bit)
< (bit,bit)
> (bit,bit)
<= (bit,bit)
>= (bit,bit)
box_inclusion_ops@> (box,point)
<< (box,box)
&< (box,box)
&> (box,box)
>> (box,box)
<@ (box,box)
@> (box,box)
~= (box,box)
&& (box,box)
<<| (box,box)
&<| (box,box)
|&> (box,box)
|>> (box,box)
bpchar_bloom_ops= (character,character)
bpchar_minmax_ops= (character,character)
< (character,character)
<= (character,character)
> (character,character)
>= (character,character)
bytea_bloom_ops= (bytea,bytea)
bytea_minmax_ops= (bytea,bytea)
< (bytea,bytea)
<= (bytea,bytea)
> (bytea,bytea)
>= (bytea,bytea)
char_bloom_ops= ("char","char")
char_minmax_ops= ("char","char")
< ("char","char")
<= ("char","char")
> ("char","char")
>= ("char","char")
date_bloom_ops= (date,date)
date_minmax_ops= (date,date)
< (date,date)
<= (date,date)
> (date,date)
>= (date,date)
date_minmax_multi_ops= (date,date)
< (date,date)
<= (date,date)
> (date,date)
>= (date,date)
float4_bloom_ops= (float4,float4)
float4_minmax_ops= (float4,float4)
< (float4,float4)
> (float4,float4)
<= (float4,float4)
>= (float4,float4)
float4_minmax_multi_ops= (float4,float4)
< (float4,float4)
> (float4,float4)
<= (float4,float4)
>= (float4,float4)
float8_bloom_ops= (float8,float8)
float8_minmax_ops= (float8,float8)
< (float8,float8)
<= (float8,float8)
> (float8,float8)
>= (float8,float8)
float8_minmax_multi_ops= (float8,float8)
< (float8,float8)
<= (float8,float8)
> (float8,float8)
>= (float8,float8)
inet_inclusion_ops<< (inet,inet)
<<= (inet,inet)
>> (inet,inet)
>>= (inet,inet)
= (inet,inet)
&& (inet,inet)
inet_bloom_ops= (inet,inet)
inet_minmax_ops= (inet,inet)
< (inet,inet)
<= (inet,inet)
> (inet,inet)
>= (inet,inet)
inet_minmax_multi_ops= (inet,inet)
< (inet,inet)
<= (inet,inet)
> (inet,inet)
>= (inet,inet)
int2_bloom_ops= (int2,int2)
int2_minmax_ops= (int2,int2)
< (int2,int2)
> (int2,int2)
<= (int2,int2)
>= (int2,int2)
int2_minmax_multi_ops= (int2,int2)
< (int2,int2)
> (int2,int2)
<= (int2,int2)
>= (int2,int2)
int4_bloom_ops= (int4,int4)
int4_minmax_ops= (int4,int4)
< (int4,int4)
> (int4,int4)
<= (int4,int4)
>= (int4,int4)
int4_minmax_multi_ops= (int4,int4)
< (int4,int4)
> (int4,int4)
<= (int4,int4)
>= (int4,int4)
int8_bloom_ops= (bigint,bigint)
int8_minmax_ops= (bigint,bigint)
< (bigint,bigint)
> (bigint,bigint)
<= (bigint,bigint)
>= (bigint,bigint)
int8_minmax_multi_ops= (bigint,bigint)
< (bigint,bigint)
> (bigint,bigint)
<= (bigint,bigint)
>= (bigint,bigint)
interval_bloom_ops= (interval,interval)
interval_minmax_ops= (interval,interval)
< (interval,interval)
<= (interval,interval)
> (interval,interval)
>= (interval,interval)
interval_minmax_multi_ops= (interval,interval)
< (interval,interval)
<= (interval,interval)
> (interval,interval)
>= (interval,interval)
macaddr_bloom_ops= (macaddr,macaddr)
macaddr_minmax_ops= (macaddr,macaddr)
< (macaddr,macaddr)
<= (macaddr,macaddr)
> (macaddr,macaddr)
>= (macaddr,macaddr)
macaddr_minmax_multi_ops= (macaddr,macaddr)
< (macaddr,macaddr)
<= (macaddr,macaddr)
> (macaddr,macaddr)
>= (macaddr,macaddr)
macaddr8_bloom_ops= (macaddr8,macaddr8)
macaddr8_minmax_ops= (macaddr8,macaddr8)
< (macaddr8,macaddr8)
<= (macaddr8,macaddr8)
> (macaddr8,macaddr8)
>= (macaddr8,macaddr8)
macaddr8_minmax_multi_ops= (macaddr8,macaddr8)
< (macaddr8,macaddr8)
<= (macaddr8,macaddr8)
> (macaddr8,macaddr8)
>= (macaddr8,macaddr8)
name_bloom_ops= (name,name)
name_minmax_ops= (name,name)
< (name,name)
<= (name,name)
> (name,name)
>= (name,name)
numeric_bloom_ops= (numeric,numeric)
numeric_minmax_ops= (numeric,numeric)
< (numeric,numeric)
<= (numeric,numeric)
> (numeric,numeric)
>= (numeric,numeric)
numeric_minmax_multi_ops= (numeric,numeric)
< (numeric,numeric)
<= (numeric,numeric)
> (numeric,numeric)
>= (numeric,numeric)
oid_bloom_ops= (oid,oid)
oid_minmax_ops= (oid,oid)
< (oid,oid)
> (oid,oid)
<= (oid,oid)
>= (oid,oid)
oid_minmax_multi_ops= (oid,oid)
< (oid,oid)
> (oid,oid)
<= (oid,oid)
>= (oid,oid)
pg_lsn_bloom_ops= (pg_lsn,pg_lsn)
pg_lsn_minmax_ops= (pg_lsn,pg_lsn)
< (pg_lsn,pg_lsn)
> (pg_lsn,pg_lsn)
<= (pg_lsn,pg_lsn)
>= (pg_lsn,pg_lsn)
pg_lsn_minmax_multi_ops= (pg_lsn,pg_lsn)
< (pg_lsn,pg_lsn)
> (pg_lsn,pg_lsn)
<= (pg_lsn,pg_lsn)
>= (pg_lsn,pg_lsn)
range_inclusion_ops= (anyrange,anyrange)
< (anyrange,anyrange)
<= (anyrange,anyrange)
>= (anyrange,anyrange)
> (anyrange,anyrange)
&& (anyrange,anyrange)
@> (anyrange,anyelement)
@> (anyrange,anyrange)
<@ (anyrange,anyrange)
<< (anyrange,anyrange)
>> (anyrange,anyrange)
&< (anyrange,anyrange)
&> (anyrange,anyrange)
-|- (anyrange,anyrange)
text_bloom_ops= (text,text)
text_minmax_ops= (text,text)
< (text,text)
<= (text,text)
> (text,text)
>= (text,text)
tid_bloom_ops= (tid,tid)
tid_minmax_ops= (tid,tid)
< (tid,tid)
> (tid,tid)
<= (tid,tid)
>= (tid,tid)
tid_minmax_multi_ops= (tid,tid)
< (tid,tid)
> (tid,tid)
<= (tid,tid)
>= (tid,tid)
timestamp_bloom_ops= (timestamp,timestamp)
timestamp_minmax_ops= (timestamp,timestamp)
< (timestamp,timestamp)
<= (timestamp,timestamp)
> (timestamp,timestamp)
>= (timestamp,timestamp)
timestamp_minmax_multi_ops= (timestamp,timestamp)
< (timestamp,timestamp)
<= (timestamp,timestamp)
> (timestamp,timestamp)
>= (timestamp,timestamp)
timestamptz_bloom_ops= (timestamptz,timestamptz)
timestamptz_minmax_ops= (timestamptz,timestamptz)
< (timestamptz,timestamptz)
<= (timestamptz,timestamptz)
> (timestamptz,timestamptz)
>= (timestamptz,timestamptz)
timestamptz_minmax_multi_ops= (timestamptz,timestamptz)
< (timestamptz,timestamptz)
<= (timestamptz,timestamptz)
> (timestamptz,timestamptz)
>= (timestamptz,timestamptz)
time_bloom_ops= (time,time)
time_minmax_ops= (time,time)
< (time,time)
<= (time,time)
> (time,time)
>= (time,time)
time_minmax_multi_ops= (time,time)
< (time,time)
<= (time,time)
> (time,time)
>= (time,time)
timetz_bloom_ops= (timetz,timetz)
timetz_minmax_ops= (timetz,timetz)
< (timetz,timetz)
<= (timetz,timetz)
> (timetz,timetz)
>= (timetz,timetz)
timetz_minmax_multi_ops= (timetz,timetz)
< (timetz,timetz)
<= (timetz,timetz)
> (timetz,timetz)
>= (timetz,timetz)
uuid_bloom_ops= (uuid,uuid)
uuid_minmax_ops= (uuid,uuid)
< (uuid,uuid)
> (uuid,uuid)
<= (uuid,uuid)
>= (uuid,uuid)
uuid_minmax_multi_ops= (uuid,uuid)
< (uuid,uuid)
> (uuid,uuid)
<= (uuid,uuid)
>= (uuid,uuid)
varbit_minmax_ops= (varbit,varbit)
< (varbit,varbit)
> (varbit,varbit)
<= (varbit,varbit)
>= (varbit,varbit)

64.5.2.1. 演算子クラスパラメータ #

いくつかの組み込み演算子クラスは演算子クラスの振舞いに影響するパラメータを指定できます。 それぞれの演算子クラスで、指定できる独自のパラメータ群があります。 bloom演算子クラスとminmax-multi演算子クラスのみ特定のパラメータが指定できます。

bloom演算子クラスでは次のパラメータを受け取ります。

n_distinct_per_range

BRINブルームインデックスでブルームフィルタのサイズ設定に使用される、ブロックレンジ内の重複しない非NULL値の推定数を定義します。 これは、ALTER TABLEn_distinctオプションと同様に動作します。 正の値に設定された場合、各ブロックレンジにはこの数の重複しない非NULL値が含まれているとみなされます。 負の値に設定された場合、重複しない非NULL値の数はブロックレンジ内でのタプルの最大数(ブロックあたり約290行)に比例して増加するとみなされ、-1以上である必要があります。 デフォルト値は-0.1で、重複しない非NULL値の最小数は16です。

false_positive_rate

ブルームフィルタのサイズ設定のためにBRINブルームインデックスによって使用される、必要な偽陽性率を定義します。 値は0.0001から0.25の間でなければなりません。デフォルト値は0.01で、これは1%の偽陽性率です。

minmax-multi演算子クラスでは次のパラメータを受け取ります。

values_per_range

ブロック範囲を集計するためにBRIN minmaxインデックスによって格納される値の最大数を定義します。 各値は、点または区間の境界として表すこともできます。値は8から256の間である必要があり、デフォルト値は32です。

64.5.3. 拡張性 #

BRINのインタフェースは高度に抽象化されており、アクセスメソッドを実装する人は、アクセスされるデータ型のセマンティクスを実装するだけで良いようになっています。 BRIN層は、同時実行性、ログ、インデックス構造の検索を担当します。

BRINアクセスメソッドを動作させるために必要なのは、インデックスに格納された要約値の振る舞いと、それらがインデックススキャンする際にどう関係するのかを定義する少数のメソッドを実装することだけです。 つまり、BRINは一般性、コードの再利用性、整理されたインタフェースと拡張性を同時に実現しています。

BRIN用の演算子クラスは、4つのメソッドを提供する必要があります。

BrinOpcInfo *opcInfo(Oid type_oid)

インデックスが貼られた列の要約データに関する内部情報を返します。 返却値はpallocされたBrinOpcInfoへのポインタでなければなりません。 BrinOpcInfoは以下の定義を持ちます。

typedef struct BrinOpcInfo
{
    /* Number of columns stored in an index column of this opclass */
    uint16      oi_nstored;

    /* Opaque pointer for the opclass' private use */
    void       *oi_opaque;

    /* Type cache entries of the stored columns */
    TypeCacheEntry *oi_typcache[FLEXIBLE_ARRAY_MEMBER];
} BrinOpcInfo;

BrinOpcInfo.oi_opaqueは、演算子クラスのルーチンが、インデックススキャン中にサポート関数同士で情報のやり取りをするために使うことができます。

bool consistent(BrinDesc *bdesc, BrinValues *column, ScanKey *keys, int nkeys)

ある範囲について、すべてのScanKeyエントリが指定されたインデックス値と一致するかどうかを返します。 使用する属性の数はスキャンキーの一部として渡されます。 同じ属性の複数のスキャンキーを一度に渡すこともできます。 エントリの数はnkeysパラメータによって決定されます。

bool consistent(BrinDesc *bdesc, BrinValues *column, ScanKey key)

ScanKeyがある範囲のインデックス値と一致しているかどうかを返します。 属性の数はスキャンキーの一部として渡されます。 これはconsistent関数の古い後方互換のための派生型です。

bool addValue(BrinDesc *bdesc, BrinValues *column, Datum newval, bool isnull)

追加された新しい値をインデックスが表現できるように、与えられたインデックスタプルとインデックス値にしたがい、タプルの指定アトリビュートを変更します。 タプルの更新が行われれば、trueが返却されます。

bool unionTuples(BrinDesc *bdesc, BrinValues *a, BrinValues *b)

2つのインデックスタプルを統合します。 与えられた2つのインデックスタプルのうち、最初のインデックスタプルを変更して、両方のタプルを表現できるようにします。 2番目のタプルは変更されません。

省略可能ですが、BRINに対する演算子クラスは以下のメソッドを指定できます。

void options(local_relopts *relopts)

演算子クラスの振舞いを制御するユーザに可視のパラメータの集合を定義します。

options関数にはlocal_relopts構造体へのポインタが渡されますが、構造体を演算子クラスに固有のオプションの集合で満たすことが必要です。 オプションはマクロPG_HAS_OPCLASS_OPTIONS()PG_GET_OPCLASS_OPTIONS()を使って他のサポート関数からアクセスできます。

インデックス付けされた値からのキーの抽出にもBRINでのキーの表現にも柔軟性がありますので、ユーザに固有のパラメータに依存するかもしれません。

コア配布物には、4種類の演算子クラスが含まれます。すなわち、minmax、inclusion、minmax-multiとbloomです。 それらを使った演算子クラスの定義がコア配布物に必要に応じて含まれます。 同じ定義を使って、ユーザは他のデータ型のために演算子クラスを定義することができます。 そのためにソースコードを書く必要はありません。適切なシステムカタログの定義があれば十分です。 演算子ストラテジのセマンティクスは、サポート関数のソースコード中に埋め込まれていることに注意してください。

前述の4つの主要なサポート関数を実装することにより、まったく異なるセマンティクスを実装する演算子クラスも可能です。 なお、メジャーリリース間では下位互換性は保証されていません。 たとえば、新しいリリースでは、サポート関数が追加で必要になるかもしれません。

表 64.5で示すように、全順序集合を実装するデータ型のための演算子クラスを書くために、関連する演算子とともにminmaxサポート関数を使うことができます。 演算子クラスのメンバ(関数と演算子)はすべて必須です。

表64.5 Minmax演算子クラスの関数とサポート番号

演算子クラスメンバオブジェクト
サポート関数 1内部関数brin_minmax_opcinfo()
サポート関数 2内部関数brin_minmax_add_value()
サポート関数 3内部関数brin_minmax_consistent()
サポート関数 4内部関数brin_minmax_union()
Operator Strategy 1operator less-than
Operator Strategy 2operator less-than-or-equal-to
Operator Strategy 3operator equal-to
Operator Strategy 4operator greater-than-or-equal-to
Operator Strategy 5operator greater-than

表 64.6で示すように、他のデータ型の値を含む複合データ型の演算子クラスを書くには、関連する演算子とともに、inclusionサポート関数を使うことができます。 任意の言語で書かれたたったひとつの関数を追加するだけです。 機能を追加するために関数を追加できます。 すべての演算子はオプションです。 表の中依存性の項目で示されているように、ある種の演算子は他の演算子を必要とすることもあります。

表64.6 Inclusion演算子クラスの関数とサポート番号

演算子クラスメンバオブジェクト依存性
サポート関数 1内部関数brin_inclusion_opcinfo() 
サポート関数 2内部関数brin_inclusion_add_value() 
サポート関数 3内部関数brin_inclusion_consistent() 
サポート関数 4内部関数brin_inclusion_union() 
サポート関数 112つの要素をマージする関数 
サポート関数 122つの要素がマージ可能かどうか確認するオプションの関数 
サポート関数 13要素が他の要素に含まれるかどうかを確認するオプションの関数 
サポート関数 14要素が空かどうかを確認するオプションの関数 
Operator Strategy 1operator left-ofOperator Strategy 4
Operator Strategy 2operator does-not-extend-to-the-right-ofOperator Strategy 5
Operator Strategy 3operator overlaps 
Operator Strategy 4operator does-not-extend-to-the-left-ofOperator Strategy 1
Operator Strategy 5operator right-ofOperator Strategy 2
Operator Strategy 6, 18operator same-as-or-equal-toOperator Strategy 7
Operator Strategy 7, 16, 24, 25operator contains-or-equal-to 
Operator Strategy 8, 26, 27operator is-contained-by-or-equal-toOperator Strategy 3
Operator Strategy 9operator does-not-extend-aboveOperator Strategy 11
Operator Strategy 10operator is-belowOperator Strategy 12
Operator Strategy 11operator is-aboveOperator Strategy 9
Operator Strategy 12operator does-not-extend-belowOperator Strategy 10
Operator Strategy 20operator less-thanOperator Strategy 5
Operator Strategy 21operator less-than-or-equal-toOperator Strategy 5
Operator Strategy 22operator greater-thanOperator Strategy 1
Operator Strategy 23operator greater-than-or-equal-toOperator Strategy 1

サポート関数番号1から10は、BRINの内部関数用に予約されており、SQLレベルの関数は番号11から始まります。 サポート関数11は、インデックスを構築するのに必要なメイン関数です。 その関数は演算子クラスと同じデータ型を持つ2つの引数を受け取り、それらの和を返します。 もしSTORAGEパラメータで定義されていれば、inclusion 演算子クラスは異なるデータ型の和を格納できます。 和関数の返り値は、STORAGEデータ型と一致していなければなりません。

サポート関数番号12と14は、組み込みデータ型の例外事象をサポートするために提供されます。 サポート関数番号12は、マージできない異なるファミリーのネットワークアドレスをサポートするために使用されます。 サポート関数番号14は、空のレンジをサポートするために使用されます。 サポート関数番号13はオプションですが、和関数に渡される前に新しい値のチェックを行うためのものとして推奨されます。 BRINフレームワークは和が変化しない時に操作を省略することができるため、この関数を使うことによってインデックスの性能が向上する可能性があります。

表 64.7で示すように、等号演算子のみを実装しハッシュをサポートするデータ型の演算子クラスを書くために、関連する演算子とともにbloomがサポートするプロシージャを使うことができます。 演算子クラスのメンバ(プロシージャと演算子)はすべて必須です。

表64.7 Bloom演算子クラスのプロシージャとサポート番号

演算子クラスメンバオブジェクト
サポートプロシージャ 1内部関数brin_bloom_opcinfo()
サポートプロシージャ 2内部関数brin_bloom_add_value()
サポートプロシージャ 3内部関数brin_bloom_consistent()
サポートプロシージャ 4内部関数brin_bloom_union()
サポートプロシージャ 5内部関数brin_bloom_options()
サポートプロシージャ 11要素のハッシュを計算する関数
Operator Strategy 1operator equal-to

サポートプロシージャ番号1から10は、BRINの内部関数として予約されており、SQLレベルの関数は11番から始まります。 サポート関数11は、インデックスを構築するのに必要なメイン関数です。 演算子クラスと同じデータ型の引数を1つ受け取り、その値のハッシュを返す必要があります。

minmax-multi演算子クラスもまた、全順序集合を実装するデータ型を対象としており、minmax演算子クラスの単純な拡張と見なすことができます。 minmax演算子クラスは各ブロックの範囲を一つの連続した区間にまとめますが、minmax-multiはより小さな複数の区間にまとめることで、外れ値の扱いを改善します。 表 64.8で示すように、関連する演算子とともにminmax-multiがサポートするプロシージャを使うことができます。 演算子クラスのメンバ(プロシージャと演算子)はすべて必須です。

表64.8 minmax-multi演算子クラスのプロシージャとサポート番号

演算子クラスメンバオブジェクト
サポートプロシージャ 1内部関数brin_minmax_multi_opcinfo()
サポートプロシージャ 2内部関数brin_minmax_multi_add_value()
サポートプロシージャ 3内部関数brin_minmax_multi_consistent()
サポートプロシージャ 4内部関数brin_minmax_multi_union()
サポートプロシージャ 5内部関数brin_minmax_multi_options()
サポートプロシージャ 112つの値の間の距離(範囲の長さ)を計算する関数
Operator Strategy 1operator less-than
Operator Strategy 2operator less-than-or-equal-to
Operator Strategy 3operator equal-to
Operator Strategy 4operator greater-than-or-equal-to
Operator Strategy 5operator greater-than

minmaxとinclusion演算子クラスは、データ型をまたがる演算子をサポートします。 しかし、これらを使用すると依存関係はより複雑になります。 minmax演算子クラスは、両方の引数がデータ型が同じ型である完全な演算子のセットが必要になります。 追加の演算子の組を定義することにより、追加のデータ型をサポートすることができます。 表 64.6で示すように、inclusion演算子クラスのストラテジは、他の演算子クラスのストラテジに依存するか、自分自身の演算子クラスのストラテジに依存します。 演算子クラスは、依存演算子がSTORAGEデータ型とともにサポートするデータ型の左辺引数、他のサポートするデータ型をサポートする演算子の右辺引数として定義される必要があります。 minmaxの例としてfloat4_minmax_ops、inclusionの例としてbox_inclusion_opsを参照してください。