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

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;

Tip

psql提供了\dAc\dAf\dAo命令,它们给出了这些查询稍微更复杂一些的版本。