索引定义可以为索引中的每一列指定一个运算符类。
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 树索引。与默认操作符类的不同之处在于,值的比较是严格逐字符执行,而不是根据特定区域设置的排序规则执行。这使这些操作符类适用于涉及模式匹配表达式(LIKE
或 POSIX 正则表达式)的查询,但数据库不使用标准 “C” 区域设置。举例而言,你可以像这样对 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
提供了这些查询的更高级版本。