一次索引定义可以为索引的每个字段声明一个 操作符表(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);
请注意,如果你希望涉及普通比较的查询使用索引,那么你还应该创建一个使用缺省操作符表的索引。 这样的查询不能使用 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.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;