一次索引定义可以为索引的每个字段声明一个 操作符表(operator class)。
CREATE INDEX name ON table (column opclass [, ...]);
这个操作符表标识该索引用于该字段要使用的操作符。 例如,一个在int4上的 B-tree 索引将使用 int4_ops 表; 这个操作符表包括用于int4的比较函数。 实际上,该字段类型的缺省操作符通常就足够了。 拥有操作符表的原因是:对于某些数据类型,可能存在多于一个有意义的索引行为。 例如,我们可能想排序两个复数,既可能通过绝对值, 也可能通过实部。我们可以通过为该数据类型定义两个操作符表,然后在建立索引时选择合适的一个来实现这个目的。
除了缺省的以外,还有一些有内置的操作符表:
操作符表 text_pattern_ops,varchar_pattern_ops, bpchar_pattern_ops,和 name_pattern_ops 分别支持在类型 text,varchar,char,和 name 上的 B-tree 索引。他们与初始的操作符表的区别是数值是严格地一个一个字符比较的, 而不是根据区域相关的集合规则进行比较。 这样,如果服务器不使用标准的 "C" 区域设置, 那么这些操作符表适合用于那些涉及模式匹配(LIKE 或者 POSIX 正则表达式)表达式的查询。 举一个例子,你可以像下面这样对一个 varchar 字段进行索引:
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
如果你 确实使用了 C 区域,那么你可以创建一个使用缺省操作符表的索引, 而即使这样,它也会对模式匹配查询有用。 还要注意的是,如果你希望那些涉及到普通比较的查询也使用索引, 那么你应该创建用缺省操作符表的索引。这样的查询不能使用 xxx_pattern_ops 操作符表。系统允许在同一个字段上创建多个使用不同操作符表的索引。
下面的查询显示所有已定义的操作符表:
SELECT am.amname AS index_method, opc.opcname AS opclass_name FROM pg_am am, pg_opclass opc WHERE opc.opcamid = am.oid ORDER BY index_method, opclass_name;
我们可以把它扩展为显示每个表中的所有操作符:
SELECT am.amname AS index_method, opc.opcname AS opclass_name, opr.oprname AS opclass_operator FROM pg_am am, pg_opclass opc, pg_amop amop, pg_operator opr WHERE opc.opcamid = am.oid AND amop.amopclaid = opc.oid AND amop.amopopr = opr.oid ORDER BY index_method, opclass_name, opclass_operator;