支援版本: 目前 (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 樹索引將使用 int4_ops 類別;此運算子類別包含類型 int4 值的比較函數。實際上,欄位資料類型的預設運算子類別通常就足夠了。擁有運算子類別的主要原因是,對於某些資料類型,可能有多個有意義的索引行為。例如,我們可能希望按絕對值或按實部對複數資料類型進行排序。我們可以透過為資料類型定義兩個運算子類別,然後在建立索引時選擇適當的類別來完成此操作。運算子類別決定了基本的排序順序(然後可以透過新增排序選項 COLLATEASC/DESC 和/或 NULLS FIRST/NULLS LAST 來修改)。

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

  • 運算子類別 text_pattern_opsvarchar_pattern_opsbpchar_pattern_ops 分別支援類型 textvarcharchar 上的 B 樹索引。與預設運算子類別的不同之處在於,這些值是嚴格按字元逐個字元地進行比較,而不是根據特定於語言環境的排序規則進行比較。這使得這些運算子類別適合於資料庫未使用標準 C 語言環境時,涉及模式匹配表達式(LIKE 或 POSIX 正規表達式)的查詢使用。例如,您可以像這樣為 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 指令,這些指令提供了比上述查詢稍微複雜的版本。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。