返回介绍

I. 教程

II. SQL 语言

III. 服务器管理

IV. 客户端接口

V. 服务器端编程

VI. 参考手册

VII. 内部

VIII. 附录

11.8. Operator Classes

发布于 2019-09-30 03:06:39 字数 1840 浏览 933 评论 0 收藏 0

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

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.oid::regoperator 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;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文