11.9. 演算子クラスと演算子族

インデックス定義では、インデックスの各列に演算子クラスを指定することができます。

CREATE INDEX name ON table (column opclass [sort options] [, ...]);

演算子クラスにより、その列のインデックスで使用される演算子が特定されます。 例えば、int4型に対するB-treeインデックスには、int4_opsクラスを使用します。 この演算子クラスには、int4型の値用の比較関数が含まれています。 実際には、通常、列のデータ型のデフォルト演算子クラスで十分です。 演算子クラスを持つ主な理由は、複数の有意義なインデックスの振舞いを持つ、いくつかのデータ型に対してです。 例えば、複素数データ型を、絶対値と実数部のどちらかでソートする必要があるとします。 この処理は、そのデータ型の2つの演算子クラスを定義した上で、インデックスを作成する際に適切なクラスを選択することで、実行可能です。 演算子クラスは基本的なソート順を決定します。 (これはCOLLATE ASC/DESCNULLS FIRST/NULLS LAST、またはこの両方というソートオプションを付けることで変更される可能性があります。)

以下のように、デフォルトの演算子クラスとは別に、組み込み演算子クラスがいくつかあります。

以下の問い合わせは、定義済みの演算子クラスを全て返します。

SELECT am.amname AS index_method,
       opc.opcname AS opclass_name
    FROM pg_am am, pg_opclass opc
    WHERE opc.opcmethod = am.oid
    ORDER BY index_method, opclass_name;

実際のところ演算子クラスは、演算子族と呼ばれる大きな構造の一部でしかありません。 複数のデータ型が似たような動作を行う場合、データ型を跨る演算子を定義し、インデックスで使用可能とすることが有用な場合がよくあります。 このためには、各型に対する演算子クラスが同一の演算子族にまとめられている必要があります。 データ型を跨る演算子は演算子族の要素です。演算子族内の1つの演算子クラスに結びついているわけではありません。

以下の問い合わせは、定義済みの演算子族と各演算子族に含まれる演算子をすべて表示します。

SELECT am.amname AS index_method,
       opf.opfname AS opfamily_name,
       amop.amopopr::regoperator AS opfamily_operator
    FROM pg_am am, pg_opfamily opf, pg_amop amop
    WHERE opf.opfmethod = am.oid AND
          amop.amopfamily = opf.oid
    ORDER BY index_method, opfamily_name, opfamily_operator;