インデックス定義では、インデックスの各列に演算子クラスを指定することができます。
CREATE INDEXname
ONtable
(column
opclass
[sort options
] [, ...]);
演算子クラスにより、その列のインデックスで使用される演算子が特定されます。
例えば、int4
型に対するB-treeインデックスには、int4_ops
クラスを使用します。
この演算子クラスには、int4
型の値用の比較関数が含まれています。
実際には、通常、列のデータ型のデフォルト演算子クラスで十分です。
演算子クラスを持つ主な理由は、複数の有意義なインデックスの振舞いを持つ、いくつかのデータ型に対してです。
例えば、複素数データ型を、絶対値と実数部のどちらかでソートする必要があるとします。
この処理は、そのデータ型の2つの演算子クラスを定義した上で、インデックスを作成する際に適切なクラスを選択することで、実行可能です。
演算子クラスは基本的なソート順を決定します。
(これはCOLLATE
ASC
/DESC
、NULLS FIRST
/NULLS LAST
、またはこの両方というソートオプションを付けることで変更される可能性があります。)
以下のように、デフォルトの演算子クラスとは別に、組み込み演算子クラスがいくつかあります。
text_pattern_ops
、varchar_pattern_ops
、bpchar_pattern_ops
、name_pattern_ops
演算子クラスは、それぞれ、text
、varchar
、char
型上のB-treeインデックスをサポートします。
デフォルトの演算子クラスとの違いは、ロケール特有の照合規則に従わずに、文字同士を厳密に比較する点です。
これらの演算子クラスを、標準「C」ロケールを使用しないデータベースにおける、パターンマッチ式(LIKE
やPOSIX正規表現)を含む問い合わせでの使用に適したものにします。
例えば、以下のようにvarchar
のインデックスを作成できます。
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
また、インデックスを使うために通常の<
、<=
、>
、または>=
比較を含む問い合わせを希望するのであれば、デフォルトの演算子クラスでインデックスを作成しなければならないことに注意してください。
こうした問い合わせでは
演算子クラスを使用することができません。(しかし、通常の等価比較はこれらの演算子クラスを使用することができます。)
異なる演算子クラスで使用する列と同じ列に対して複数のインデックスを作成することができます。
Cロケールを使用する場合は、xxx
_pattern_ops
演算子クラスは必要ありません。
Cロケールでのパターンマッチ問い合わせでは、デフォルト演算子クラスを使用したインデックスが使用できるためです。
xxx
_pattern_ops
以下の問い合わせは、定義済みの演算子クラスを全て返します。
SELECT am.amname AS index_method, opc.opcname AS opclass_name, opc.opcintype::regtype AS indexed_type, opc.opcdefault AS is_default 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, opc.opcname AS opclass_name, opf.opfname AS opfamily_name, opc.opcintype::regtype AS indexed_type, opc.opcdefault AS is_default FROM 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.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;