Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

11.10. 运算符类和运算符族 #

索引定义可以为索引中的每一列指定一个运算符类

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

操作符类标识索引为该列使用的操作符。例如,类型为 int4 上的 B 树索引将使用 int4_ops 类;此操作符类包括 int4 值的比较函数。事实上,列的数据类型的默认操作符类通常就足够了。拥有操作符类的主要原因在于,一些数据类型可能存在多种有意义的索引行为。例如,我们可能想要根据绝对值或实部对复数数据类型进行排序。我们可以通过定义该数据类型的两个操作符类,然后在建立索引时选择合适的类来实现该目的。操作符类决定基本排序顺序(可以通过添加排序选项 COLLATEASC/DESC 和/或 NULLS FIRST/NULLS LAST 进行修改)。

除默认操作符类之外,还有一些内置操作符类。

以下查询显示所有已定义的操作符类

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 提供了这些查询的更高级版本。