2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

11.10. 運算子類和運算子族 #

索引定義可以為索引的每一列指定一個運算子類

CREATE INDEX name ON table (column opclass [ ( opclass_options ) ] [sort options] [, ...]);

運算子類標識索引在該列上使用的運算子。例如,型別為 int4 的 B-tree 索引將使用 int4_ops 類;此運算子類包含型別為 int4 的值的比較函式。實際上,列資料型別的預設運算子類通常就足夠了。運算子類的主要目的是,對於某些資料型別,可能存在多種有意義的索引行為。例如,我們可能想按絕對值或實部對複數資料型別進行排序。我們可以透過為資料型別定義兩個運算子類,然後在建立索引時選擇正確的類來實現。運算子類決定了基本的排序順序(隨後可以透過新增排序選項 COLLATEASC/DESC 和/或 NULLS FIRST/NULLS LAST 來修改)。

除了預設運算子類之外,還有一些內建的運算子類。

  • 運算子類 text_pattern_opsvarchar_pattern_opsbpchar_pattern_ops 分別支援型別為 textvarcharchar 的 B-tree 索引。與預設運算子類的區別在於,值是逐個字元進行比較,而不是根據特定於區域設定的排序規則進行比較。這使得這些運算子類適用於涉及模式匹配表示式(LIKE 或 POSIX 正則表示式)的查詢,當資料庫不使用標準的“C”區域設定時。例如,您可以像這樣索引一個 varchar 列:

    CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
    

    請注意,如果您希望涉及普通 <<=>>= 比較的查詢能夠使用索引,您也應該建立一個帶有預設運算子類的索引。此類查詢不能使用 xxx_pattern_ops 運算子類。(但是,普通相等性比較可以使用這些運算子類。)可以在同一列上建立多個具有不同運算子類的索引。如果您確實使用了 C 區域設定,則不需要 xxx_pattern_ops 運算子類,因為在 C 區域設定中,預設運算子類也可用於模式匹配查詢。

以下查詢顯示了所有已定義的運算子類:

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;

運算子類實際上只是一個稱為運算子族的更大結構的一個子集。在幾種資料型別具有相似行為的情況下,經常需要定義跨資料型別的運算子並允許這些運算子與索引一起工作。為此,每種型別的運算子類必須分組到同一個運算子族中。跨型別運算子是該族的一部分,但與族內的任何單個類無關。

這個擴充套件版本的前一個查詢顯示了每個運算子類所屬的運算子族。

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;

提示

psql 提供了命令 \dAc\dAf\dAo,它們提供了這些查詢的稍高階版本。

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的實際使用不符之處,或需要進一步澄清之處,請使用此表單來報告文件問題。