【JPUG主催】PostgreSQLカンファレンス2020【11月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

67.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 key)

ScanKeyがある範囲のインデックス値と一致しているかどうかを返します。 属性の数はスキャンキーの一部として渡されます。

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

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

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

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

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

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

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

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

演算子クラスメンバーオブジェクト
Support Function 1internal function brin_minmax_opcinfo()
Support Function 2internal function brin_minmax_add_value()
Support Function 3internal function brin_minmax_consistent()
Support Function 4internal function 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

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

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

演算子クラスメンバーオブジェクト依存性
Support Function 1internal function brin_inclusion_opcinfo() 
Support Function 2internal function brin_inclusion_add_value() 
Support Function 3internal function brin_inclusion_consistent() 
Support Function 4internal function brin_inclusion_union() 
Support Function 11function to merge two elements 
Support Function 12optional function to check whether two elements are mergeable 
Support Function 13optional function to check if an element is contained within another 
Support Function 14optional function to check whether an element is empty 
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, 13, 16, 24, 25operator contains-or-equal-to 
Operator Strategy 8, 14, 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フレームワークは和が変化しない時に操作を省略することができるため、この関数を使うことによってインデックスの性能が向上する可能性があります。

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