操作符类和操作符族

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 11. 索引 | 下一页

# 11.9. 操作符类和操作符族

定义索引的同时可以为索引的每个字段声明一个操作符类。

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

这个操作符类指明该索引用于该字段时要使用的操作符。例如，一个在`int4` 上的 B-tree 索引将使用`int4_ops`类；这个操作符类包括用于`int4` 的比较函数。实际上，字段类型的缺省操作符通常就足够了。拥有操作符类的主要原因是： 对于某些数据类型，可能存在多个有意义的索引行为。例如，我们可能想排序两个复数， 既可能通过绝对值，也可能通过实部。我们可以通过为该数据类型定义两个操作符类， 然后在建立索引时选择合适的那个。操作符类决定了基本的排序方式（这个方式可以通过添加排序选项来修改： `COLLATE`, `ASC`/`DESC` 和/或 `NULLS FIRST`/`NULLS LAST`）。

除了缺省的以外，还有一些有内置的操作符类：

- `text_pattern_ops`,`varchar_pattern_ops`和`bpchar_pattern_ops` 操作符类分别支持在`text`, `varchar`和`char`类型上的 B-tree 索引。 他们与初始的操作符类的区别是数值是严格地逐个字节比较的，而不是根据区域相关的排序规则进行比较。 这样，如果数据库不使用标准的"C"区域设置，那么这些操作符类适用于那些涉及模式匹配表达式 (`LIKE`或者 POSIX 正则表达式)的查询。举一个例子， 你可以像下面这样对一个`varchar`字段进行索引：

      CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

  请注意，如果你希望包含普通`<`,`<=`, `>`,或 `>=`比较的查询使用索引，那么你还应该创建一个使用缺省操作符类的索引。 这样的查询不能使用``xxx`_pattern_ops`操作符类。 （不过普通相等比较可以使用这个操作符类。）在同一个字段上创建多个使用不同操作符类的索引是可能的。 如果你确实使用了标准的"C"区域设置，那么你就不需要``xxx`_pattern_ops` 操作符类，因为使用缺省操作符类的索引可以用于 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;

上一页 | 起始页 | 下一页
部分索引 | 上一级 | 索引和排序