问题报告 纠错本页面

11.9. 操作符类和操作符族

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

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

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

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

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

SELECT am.amname AS index_method,
       opc.opcname AS opclass_name
    FROM pg_am am, pg_opclass opc
    WHERE opc.opcmethod = am.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;