# 11.10.算子类和算子族

索引定义可以指定操作员类对于索引的每一列。

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

operator类标识该列的索引要使用的运算符。例如,类型上的B树索引int4会使用国际4_行动班此运算符类包括类型为的值的比较函数int4.实际上,列的数据类型的默认运算符类通常就足够了。拥有运算符类的主要原因是,对于某些数据类型,可能存在多个有意义的索引行为。例如,我们可能希望按绝对值或实部对复数数据类型进行排序。我们可以为数据类型定义两个操作符类,然后在创建索引时选择合适的类。运算符类确定基本排序顺序(然后可以通过添加排序选项来修改)整理,ASC/描述和/或先空/最后为空).

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

  • 运算符类文本模式操作, varchar_pattern_opsbpchar_模式_操作支持类型上的B树索引文本, 瓦尔查尔烧焦分别地与默认运算符类的不同之处在于,严格地逐字符比较值,而不是根据特定于语言环境的排序规则。这使得这些运算符类适合于涉及模式匹配表达式的查询(喜欢或POSIX正则表达式),当数据库不使用标准的“C”语言环境时。例如,您可以为瓦尔查尔像这样的专栏:

    CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
    

    请注意,如果希望查询涉及普通运算符,还应使用默认运算符类创建索引<, <=, >>=使用索引进行比较。此类查询不能使用*xxx*_模式操作操作员类。(不过,普通的等式比较可以使用这些运算符类。)可以使用不同的运算符类在同一列上创建多个索引。如果使用C语言环境,则不需要*xxx*_模式操作运算符类,因为带有默认运算符类的索引可用于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, \达夫\刀,它提供了这些查询的稍微复杂的版本。