表 38.3で示すように、btree演算子クラスは次の5つの比較演算子を提供しなければなりません。
<
、<=
、=
、>=
、そして>
です。
<>
も演算子クラスの一部であると期待する方もいるかもしれませんが、そうではありません。
インデックス検索のWHERE句で<>
を使うのは、ほとんど常に役に立たないからです。
(ある種の目的のためにプランナは<>
をbtree演算子クラスに関連しているものとして扱います。
しかし、プランナはpg_amop
から検索するのではなく=
の否定子リンクから検索します。)
複数のデータ型がほとんど同じソートセマンティクスを共有している場合、それらの演算子クラスは演算子族にまとめることができます。 そうすることによりプランナが型をまたがる比較を推論できるので、これはメリットがあります。 ファミリー中の演算子クラスには、入力データ型のための単一型演算子(および関連するサポート関数)が含まれます。 一方型をまたがる比較演算子とサポート関数は演算子族中で「ゆるやか」です。 プランナが推移関係から推論するすべての比較条件を提示できるように、型をまたがる演算子の完全な集合を演算子族に入れておくことをお勧めします。
btree演算子族が満たさなければならない基本的な前提条件があります。
=
演算子は等号関係でなければなりません。
つまり、そのデータ型のすべての非NULL値A
、B
、C
について、
A
=
A
が真である(反射律)
A
=
B
なら、B
=
A
である(対称律)
A
=
B
かつB
=
C
なら、A
=
C
である(推移律)
<
は強順序関係でなければなりません。つまり、すべての非NULL値A
、B
、C
に対して、
A
<
A
は偽である(非反射律)
A
<
B
かつB
<
C
なら、A
<
C
である(推移律)
更に、順序は全である。すなわち、すべての非NULL値A
、B
に対して、
厳密にA
<
B
、A
=
B
、B
<
A
のうちどれか一つが真(三分律)
(もちろん、三分律は比較サポート関数の定義を正当化します。)
他の3つの演算子は=
と<
に沿って自明に定義され、それらと一貫していなければなりません。
複数のデータ型をサポートする演算子族について、演算子族中のデータ型であるどんなA
、B
、C
も上記の法則を満たさなければなりません。
型をまたがる際に2つあるいは3つの異なる演算子が一貫していることを表明することになるので、推移律を満たすことはもっとも困難です。
例をあげると、少なくともfloat8
と比較するためにnumeric
値をfloat8
に変換する現在の意味論のもとでは、float8
とnumeric
を同じ演算子族に加えるのはうまくいかないでしょう。
float8
の精度に限りがあるからです。
これは同じfloat8
値に対して等号比較する複数の異なるnumeric
値が存在することを意味し、したがって推移律は満たされません。
複数データ型ファミリーに関する別な要件は、演算子族に含まれるデータ型間に定義される暗黙的あるいは二値型強制(binary-coercion)キャストは、関係するソート順を変更してはならないことです。
単一のデータ型において、btreeインデックスがこれらの法則を守ることを要求するのはかなり明確です。 これらの法則なしにはキー並べる順序がなくなってしまうからです。 また、異なるデータ型の比較キーを使うインデックス検索では、2つのデータ型またがる比較が正常に動作することが必要です。 演算子族中で3つ以上のデータ型に対する拡張はbtreeインデックスの機構自体では要求されませんが、プランナは最適化の目的でそれらに依存します。