インデックス定義は、インデックスの各列に対して演算子クラスを指定することができる。
CREATE INDEX名ONテーブル (列opclass [ ( opclass_options ) ] [ソートオプション] [, ...]);演算子クラスは、その列のインデックスによって使用される演算子を識別します。 たとえば、タイプint4のBツリーインデックスはint4_opsクラスを使用します。この演算子クラスには、タイプint4の値の比較関数が含まれます。 実際には、通常、列のデータ型の既定の演算子クラスで十分です。 演算子クラスを持つ主な理由は、一部のデータ型では、複数の意味のあるインデックス動作が存在する可能性があるためです。 たとえば、複素数データ型を絶対値または実数部でソートする場合があります。 これを行うには、データ型の2つの演算子クラスを定義し、インデックスを作成するときに適切なクラスを選択します。 演算子クラスは、基本的なソート順序を決定します (ソートオプションCOLLATE、ASC /DESC、および /またはNULLS FIRST /NULLS LASTを追加することで変更できます) 。
デフォルトのクラス以外にもいくつかの組み込み演算子クラスがあります。
演算子クラスtext_pattern_ops、varchar_pattern_ops、およびbpchar_pattern_opsは、それぞれtext、varchar、およびchar型のBツリーインデックスをサポートします。 デフォルトの演算子クラスとの違いは、値がロケール固有の照合規則に従ってではなく、厳密に文字ごとに比較されることです。 これにより、これらの演算子クラスは、データベースが標準の「C」ロケールを使用しない場合に、パターンマッチング式 (LIKEまたはPOSIX正規表現) を含むクエリで使用するのに適しています。 例として、次のようにvarchar列にインデックスを付けることができます。
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);通常の < 、<= 、> 、または >= 比較を含むクエリでインデックスを使用する場合は、デフォルトの演算子クラスでインデックスを作成する必要があります。 このようなクエリは、_pattern_ops演算子クラスを使用できません。 (ただし、通常の等価比較では、これらの演算子クラスを使用できます。) 異なる演算子クラスを使用して、同じ列に複数のインデックスを作成することができます。 Cロケールを使用する場合、_pattern_ops演算子クラスは必要ありません。これは、既定の演算子クラスを持つインデックスがCロケールのパターンマッチングクエリに使用できるためです。
次のクエリは、定義されたすべての演算子クラスを示します。
SELECT am.amname AS index_method,
opc.opcname AS opclass_name,
opc.opcintype::regtype AS indexed_type,
opc.opcdefault AS is_default
pg_am amから、pg_opclass opc
WHERE opc.opcmethod = am.oid
ORDER BY index_method、opclass_name; 演算子クラスは、実際には、演算子ファミリと呼ばれるより大きな構造のサブセットにすぎません。 複数のデータ型の動作が似ている場合は、クロスデータ型の演算子を定義し、インデックスを操作できるようにすると便利です。 これを行うには、各型の演算子クラスを同じ演算子ファミリにグループ化する必要があります。 クロスタイプ演算子はファミリのメンバーですが、ファミリ内の単一のクラスには関連付けられていません。
前のクエリのこの拡張バージョンは、各演算子クラスが属する演算子ファミリーを示しています。
SELECT am.amname AS index_method,
opc.opcname AS opclass_name,
opf.opfname AS opfamily_name,
opc.opcintype::regtype AS indexed_type,
opc.opcdefault AS is_default
pg_am am、pg_opclass opc、pg_opfamily opfから
WHERE opc.opcmethod = am.oid AND
opc.opcfamily = opf.oid
ORDER BY index_method、opclass_name; このクエリは、定義されたすべての演算子ファミリと各ファミリに含まれるすべての演算子を示します。
SELECT am.amname AS index_method,
opf.opfname AS opfamily_name,
amop. amopr::regoperator AS opfamily_operator
FROM pg_am am, pg_opfamily opf, pg_amop amop
WHERE opf.opfmethod = am.oid AND
amop.amopfamily = opf.oid
index_method、opfamily_name、opfamily_operator;