如 表 38.3 所示,btree 運算子類別必須提供五個比較運算子,<
、<=
、=
、>=
和 >
。你可能會預期 <>
也應該是運算子類別的一部分,但事實並非如此,因為在索引搜尋中使用 <>
WHERE 子句幾乎沒有用處。(對於某些目的,規劃器會將 <>
視為與 btree 運算子類別相關聯;但它會透過 =
運算子的否定連結,而不是從 pg_amop
找到該運算子。)
當多種資料類型共用近乎相同的排序語意時,其運算子類別可以分組為運算子家族。這麼做的好處是,它允許規劃器對跨類型比較進行演繹。家族中的每個運算子類別都應包含其輸入資料類型的單一類型運算子(及相關支援函式),而跨類型比較運算子及支援函式則在家族中是「鬆散」的。建議在家族中包含一組完整的跨類型運算子,如此一來,規劃器就能表示從遞移性演繹出的任何比較條件。
btree 運算子家族必須符合一些基本假設
一個 =
運算子必須是一個等價關係;也就是說,對於資料類型的所有非空值 A
、B
、C
A
=
A
為真(自反律)
如果 A
=
B
,則 B
=
A
(對稱律)
如果 A
=
B
且 B
=
C
,則 A
=
C
(遞移律)
一個 <
運算子必須是一個強排序關係;也就是說,對於所有非空值 A
、B
、C
A
<
A
為假(非自反律)
如果 A
<
B
且 B
<
C
,則 A
<
C
(遞移律)
此外,排序是完全的;也就是說,對於所有非空值 A
、B
A
<
B
、A
=
B
、B
<
A
中,恰好有一個為真(三段律)
(三段律當然證明了比較支援函式的定義。)
其他三個運算子以顯而易見的方式定義在 =
和 <
的基礎上,並且必須與它們保持一致。
對於支援多種資料類型的運算子家族,當 A
、B
、C
取自家族中的任何資料類型時,上述定律必須成立。遞移定律最難確保,因為在跨類型情況中,它們表示兩個或三個不同運算子的行為一致的陳述。舉例來說,將 float8
和 numeric
放入同一個運算子家族是不行的,至少在 numeric
值會轉換為 float8
以與 float8
比較的目前語意下是不行的。由於 float8
的精確度有限,這表示有不同的 numeric
值會與同一個 float8
值相等,因此遞移定律會失敗。
多資料類型家族的另一個需求是,在運算子家族中包含的資料類型之間定義的任何隱式或二元強制轉換不得變更關聯的排序順序。
btree 索引需要在單一資料類型中維持這些定律的原因應該很清楚:沒有這些定律,就無法對鍵進行排序。此外,使用不同資料類型比較鍵的索引搜尋需要比較在兩個資料類型間合理地執行。btree 索引機制本身並不要求家族中延伸到三個或更多資料類型,但規劃器依賴它們進行最佳化。
如果您在文件檔中看到任何不正確、與您對特定功能的體驗不符或需要進一步說明的地方,請使用 此表單 回報文件檔問題。