演算子クラスに関連付けられている演算子は、「ストラテジ番号」により識別されます。「ストラテジ番号」は、その演算子クラスのコンテキスト内における各演算子のセマンティクスを識別します。 たとえば、B-tree の場合、キーが小さい方から大きい方へ厳密に並んでいなければなりません。したがって、B-tree に関しては、「より小さい」および「以上」のような演算子は興味深いと言えます。 PostgreSQL ではユーザが演算子を定義できるため、PostgreSQL は演算子の名前 (たとえば < や >=) を見つけてその演算子がどのような比較を行なうかを判断したりはできません。 その代わり、インデックスアクセスメソッドにより「ストラテジ」のセットを定義します。「ストラテジ」は、汎用演算子と考えることができます。 各演算子クラスは、特定のデータ型およびインデックスセマンティックの解釈において、実際のどの演算子が各ストラテジに対応しているかを示します。
Table 14-1 に示されているように、B-tree インデックスではストラテジを 5 つ定義します。
ハッシュインデックスは、ビット毎の類似性のみを表します。したがって、Table 14-2 に示されているように、ストラテジを 1 つのみ定義します。
R-tree インデックスは、四角形に閉じた関係を表します。 Table 14-3 に示されているように、R-tree インデックスはストラテジを 8 つ定義します。
Table 14-3. R-tree ストラテジ
演算 | ストラテジ番号 |
---|---|
より左 (left of) | 1 |
より左またはオーバーラップ (left of or overlapping) | 2 |
オーバーラップ (overlapping) | 3 |
より右またはオーバーラップ (right of or overlapping) | 4 |
より右 (right of) | 5 |
同じ (same) | 6 |
含む (contains) | 7 |
含まれる (contained by) | 8 |
GiST インデックスは、より柔軟です。 ストラテジの固定のセットを設定する必要がまったくありません。 代わりに、特定の GiST 演算子クラスの "consistency" サポートルーチンにより、ストラテジ番号が何を意味するかを解釈します。
ところで、pg_am の amorderstrategy の項目は、アクセスメソッドが順スキャンをサポートするかどうかを示します。 ゼロはサポートしないことを意味します。 サポートする場合は、amorderstrategy が順番の演算子と対応するストラテジ番号になります。例えば、B-tree ではamorderstrategy = 1 となっており、これが "より小さい"のストラテジ番号です。
つまり、演算子クラスは、演算子クラスのデータ型についての各セマンティックの概念を表す演算子のセットを指定する必要があります。