博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.9. 操作符类和操作符族
阅读量:6340 次
发布时间:2019-06-22

本文共 2042 字,大约阅读时间需要 6 分钟。

11.9. 操作符类和操作符族

一个索引定义可以为索引中的每一列都指定一个操作符类

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

操作符类标识该列上索引要使用的操作符。例如,一个int4类型上的B树索引会使用int4_ops类,这个操作符类包括用于int4类型值的比较函数。实际上列的数据类型的默认操作符类通常就足够了。存在多个操作符类的原因是,对于某些数据类型可能会有多于一种的有意义的索引行为。例如,我们可能想要对一种复数数据类型按照绝对值排序或者按照实数部分排序。我们可以通过为该数据类型定义两个操作符类来实现,并且在创建一个索引时选择合适的类。操作符类会决定基本的排序顺序(可以通过增加排序选项COLLATEASC/DESC和/或 NULLS FIRST/NULLS LAST来修改)。

除了默认的操作符类,还有一些内建的操作符类:

  • 操作符类text_pattern_opsvarchar_pattern_ops和 bpchar_pattern_ops分别支持类型textvarchar和 char上的B树索引。它们与默认操作符类的区别是值的比较是严格按照字符进行而不是根据区域相关的排序规则。这使得这些操作符类适合于当一个数据库没有使用标准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,       opc.opcintype::regtype AS indexed_type,       opc.opcdefault AS is_default    FROM pg_am am, pg_opclass opc    WHERE opc.opcmethod = am.oid    ORDER BY index_method, opclass_name;

一个操作符类实际上只是一个更大的被称为操作符族的结构的一个子集。在多种数据类型具有相似行为的情况下,常常会定义跨数据类型的操作符并且允许索引使用它们。为了实现该目的,这些类型的操作符类必须被分组到同一个操作符族中。跨类型的操作符是该族的成员,但是并不与族内任意一个单独的类相关联。

前一个查询的扩展版本展示了每个操作符类所属的操作符族:

SELECT am.amname AS index_method,       opc.opcname AS opclass_name,       opf.opfname AS opfamily_name,       opc.opcintype::regtype AS indexed_type,       opc.opcdefault AS is_default    FROM pg_am am, pg_opclass opc, pg_opfamily opf    WHERE opc.opcmethod = am.oid AND          opc.opcfamily = opf.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;

本文转自PostgreSQL中文社区,原文链接:

转载地址:http://vleoa.baihongyu.com/

你可能感兴趣的文章
人类投资经理再也无法击败电脑的时代终将到来了...
查看>>
一个最小手势库的实现
查看>>
HoloLens开发手记 - Vuforia开发概述 Vuforia development overview
查看>>
Android支付之支付宝封装类
查看>>
<亲测>CentOS中yum安装ffmpeg
查看>>
【分享】马化腾:产品设计与用户体验
查看>>
【机器学习PAI实践十】深度学习Caffe框架实现图像分类的模型训练
查看>>
全智慧的网络:思科十年来最具颠覆性的创新
查看>>
怎样将现有应用迁移到 VMware NSX
查看>>
赛门铁克收购以色列移动安全初创公司Skycure 旨在构建网络安全防御平台
查看>>
《Photoshop蒙版与合成(第2版)》目录—导读
查看>>
“最佳人气奖”出炉!4月27号,谁能拿到阿里聚安全算法挑战赛的桂冠?
查看>>
《网页美工设计Photoshop+Flash+Dreamweaver从入门到精通》——2.6 图层与图层样式...
查看>>
《iOS组件与框架——iOS SDK高级特性剖析》——第2章,第2.7节获取线路
查看>>
Spring中 @Autowired标签与 @Resource标签 的区别
查看>>
人工智能凭什么毁灭人类
查看>>
[LeetCode]--349. Intersection of Two Arrays
查看>>
tomcat启动报错
查看>>
mongorocks引擎原理解析
查看>>
oracle11g R2 RAC卸载grid
查看>>