インデックス定義では、インデックスの各列に演算子クラスを指定することができます。
CREATE INDEX name ON table (column opclass [, ...]);
演算子クラスにより、その列のインデックスで使用される演算子が特定されます。 たとえば、int4につけたB-treeインデックスには、int4_opsクラスを使用します。 この演算子クラスには、int4値用の比較関数が含まれています。 実際には、通常、列のデータ型のデフォルト演算子クラスで十分です。 演算子クラスの主な意義は、複数の有意義なインデックスの振舞いを持つ、いくつかのデータ型用です。 たとえば、複素数データ型を、絶対値と実数部のどちらかでソートする必要があるとします。 この処理は、そのデータ型の2つの演算子クラスを定義したうえで、インデックスを作成する際に適切なクラスを選択することで、実行可能です。
以下のように、デフォルトの演算子クラスとは別に、組み込み演算子クラスがいくつかあります。
text_pattern_ops、varchar_pattern_ops、bpchar_pattern_opsおよびname_pattern_ops演算子クラスは、それぞれ、text、varchar、charおよびname型上のB-treeインデックスをサポートします。 通常の演算子クラスとの違いは、ロケール特有の照合規則に従わずに、文字同士を厳密に比較する点です。 これらの演算子を、標準"C"ロケールを使用しないサーバにおける、パターンマッチ式(LIKEやPOSIX正規表現)を含む問い合わせでの使用に適したものにします。 例えば、以下のようにvarcharのインデックスを作成できます。
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
Cロケールを使用する場合は、デフォルトの演算子クラスでインデックスを作成しても構いません。 その時でもパターンマッチ問い合わせで有用です。 また、通常の比較を含む問い合わせでインデックスを使用したいのであれば、デフォルトの演算子クラスでインデックスを作成しなければならないことに注意してください。 こうした問い合わせではxxx_pattern_ops演算子クラスを使用することができません。 ことなる演算子クラスで使用する列と同じ列に対して複数のインデックスを作成することができます。
以下の問い合わせは、定義済みの演算子クラスをすべて返します。
SELECT am.amname AS index_method, opc.opcname AS opclass_name FROM pg_am am, pg_opclass opc WHERE opc.opcamid = am.oid ORDER BY index_method, opclass_name;
この問い合わせは、以下のようにすると、各クラスに含まれる演算子をすべて返すように拡張可能です。
SELECT am.amname AS index_method, opc.opcname AS opclass_name, opr.oprname AS opclass_operator FROM pg_am am, pg_opclass opc, pg_amop amop, pg_operator opr WHERE opc.opcamid = am.oid AND amop.amopclaid = opc.oid AND amop.amopopr = opr.oid ORDER BY index_method, opclass_name, opclass_operator;