索引定義可以為索引的每個欄位指定一個運算子類別。
CREATE INDEXname
ONtable
(column
opclass
[ (opclass_options
) ] [sort options
] [, ...]);
運算子類別識別索引將用於該欄位的運算子。例如,類型 int4
上的 B 樹索引將使用 int4_ops
類別;此運算子類別包含類型 int4
值的比較函數。實際上,欄位資料類型的預設運算子類別通常就足夠了。擁有運算子類別的主要原因是,對於某些資料類型,可能有多個有意義的索引行為。例如,我們可能希望按絕對值或按實部對複數資料類型進行排序。我們可以透過為資料類型定義兩個運算子類別,然後在建立索引時選擇適當的類別來完成此操作。運算子類別決定了基本的排序順序(然後可以透過新增排序選項 COLLATE
、ASC
/DESC
和/或 NULLS FIRST
/NULLS LAST
來修改)。
除了預設運算子類別之外,還有一些內建的運算子類別
運算子類別 text_pattern_ops
、varchar_pattern_ops
和 bpchar_pattern_ops
分別支援類型 text
、varchar
和 char
上的 B 樹索引。與預設運算子類別的不同之處在於,這些值是嚴格按字元逐個字元地進行比較,而不是根據特定於語言環境的排序規則進行比較。這使得這些運算子類別適合於資料庫未使用標準 “C” 語言環境時,涉及模式匹配表達式(LIKE
或 POSIX 正規表達式)的查詢使用。例如,您可以像這樣為 varchar
欄位建立索引
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
請注意,如果您希望涉及普通 <
、<=
、>
或 >=
比較的查詢使用索引,則還應使用預設運算子類別建立索引。此類查詢無法使用
運算子類別。(但是,普通的等式比較可以使用這些運算子類別。)可以在同一欄位上使用不同的運算子類別建立多個索引。如果您使用 C 語言環境,則不需要 xxx
_pattern_ops
運算子類別,因為具有預設運算子類別的索引可用於 C 語言環境中的模式匹配查詢。xxx
_pattern_ops
以下查詢顯示所有已定義的運算子類別
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
指令,這些指令提供了比上述查詢稍微複雜的版本。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。