他のバージョンの文書 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

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

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

表71.2 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

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

表71.3 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フレームワークは和が変化しない時に操作を省略することができるため、この関数を使うことによってインデックスの性能が向上する可能性があります。

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

表71.4 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はより小さな複数の区間にまとめることで、外れ値の扱いを改善します。 表 71.5で示すように、関連する演算子とともにminmax-multiがサポートするプロシージャを使うことができます。 演算子クラスのメンバー(プロシージャと演算子)はすべて必須です。

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