14.2. アクセスメソッドおよび演算子クラス

pg_am テーブルには各インデックスアクセスメソッド用の行が一つずつ含まれています。 PostgreSQL では、標準テーブルへのアクセスはサポートされていますが、すべてのインデックスアクセスメソッドは、この pg_am で記述されています。 必要なインタフェースルーチンを定義し、pg_am に行を作成することによって、新しいインデックスアクセスメソッドを追加することが可能です。しかし、この方法については、この章では記述していません。

インデックスアクセスメソッドのルーチンには、アクセスメソッドが演算するデータ型について、直接的には何の情報も与えられていません。 代わりに演算子クラスが、特定のデータ型の操作においてアクセスメソッドが使用できる必要のある演算のセットを定義します。 演算子クラスという名前の由来は、それらが指定するものの 1 つにインデックスで使用できる WHERE 句演算子のセットがあるからです (つまり、インデックススキャン条件に変換可能です)。 また、演算子クラスは、インデックスアクセスメソッドの内部演算で必要な、しかしインデックスで使用できる WHERE 句演算子には直接的には対応しないサポートプロシージャをいくつか指定することができます。

同じ入力データ型およびインデックスアクセスメソッドに対して、複数の演算子クラスを定義することが可能です。 これにより、複数のインデックスセマンティックのセットを、1 つのデータ型に定義することが可能です。 たとえば、B-tree インデックスでは、処理するデータ型ごとにソート順を定義する必要があります。 複素数データ型では、複素数の絶対値によりデータをソートする B-tree 演算子クラスと、実際の数値によりソートする B-tree 演算子クラスをもつといった方法は、有用かもしれません。 通常は演算子クラスの 1 つが一般的に最も有用であると判断され、そのデータ型およびインデックスアクセスメソッドに対するデフォルトの演算子クラスとして設定されます。

複数の異なるアクセスメソッドに、同一の演算子クラス名を使用することができます (例えば、B-tree と ハッシュアクセスメソッドは、両方とも oid_ops という名前の演算子クラスを持つことができます)。 ただし、そのような各クラスは独立した実体であり、別々に定義される必要があります。