©
本文档使用
php.cn手册 发布
定义索引的同时可以为索引的每个字段声明一个操作符类operator class。
CREATE INDEX name ON table (column opclass [sort options] [, ...]);
这个操作符类指明该索引用于该字段时要使用的操作符。 例如,一个在int4上的B-tree索引将使用int4_ops类;这个操作符类包括用于int4的比较函数。 实际上,字段类型的缺省操作符通常就足够了。拥有操作符类的主要原因是:对于某些数据类型,可能存在多个有意义的索引行为。 例如,我们可能想排序两个复数,既可能通过绝对值,也可能通过实部。我们可以通过为该数据类型定义两个操作符类,然后在建立索引时选择合适的那个。 操作符类决定基本的排序顺序(通过添加排序选项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 FROM pg_am am, pg_opclass opc WHERE opc.opcmethod = am.oid ORDER BY index_method, opclass_name;
一个操作符类实际上是一个称为 operator family的更大结构的子集。当几个数据类型的作用类似时,可以定义cross-data-type类型操作符并且与索引一起使用。 要做到这一点,每个类型的操作符类必须分成相同的操作符组。cross-type型的操作符是组成员,但不与组内的任何单个类连接。
这个查询显示所有已定义的操作符组和所有包含在每个组中的所有操作符:
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;