PostgreSQL基础知识( 九 )


行化的工作还在进行中,最终目标是所有的语句都能利用到多核并行执
行 。详情参见 9.4 节 。
支持关联词组全文检索
全文检索支持关联词组搜索,可以使用 <-> 运算符来表示两个关联
词之间的距离 。即使关联词没有连在一起出现,只要二者出现的位置不
超出前述距离,也认为该关联词组搜索命中 。在 9.6 之前的版本中,只
能搜索一些单个的词,但该功能使得用户可以搜索一组有前后顺序的词
组 。详情请参见 5.8 节 。
psql 工具支持 gexec 参数该参数的功能是读取并执行一个根据查询语句动态生成的 SQL 。详
情请参见 3.4.5 节 。
postgres_fdw 增强
对于简单的更新、插入和删除来说,速度有很大提升 。请参考博
文“Directly Modify Foreign Tables”以了解详情 。
FDW 关联操作下推
包括 postgres_fdw 在内的部分 FDW 已支持该特性 。当需要对多
张外表做关联查询时,之前的做法是把每张外表的数据取回本地然后做
关联计算,支持了该特性的 FDW 的优化处理方式是:如果需要关联的
两张外表都来自于同一台外部服务器,那么就把 join 操作下推到这个外
部服务器上去执行,然后仅把关联结果拿回来 。这样可以极大地减少经
网络传输的记录数 。当关联操作可以过滤掉大量数据时,这个特性带来
的性能提升是巨大的 。
1.6.4 PostgreSQL 9.5中引入的新特性
PostgreSQL 9.5 发布于 2016 年 1 月,其主要的新特性如下 。
外部表架构的改进
支持了新的 IMPORT FOREIGN SCHEMA 命令,通过该命令可以从外
部服务器中加载表结构信息从而实现批量创建外表 。支持外表继承:本
地表可以继承自外表,外表也可以继承自本地表,外表也可以继承自另
一张外表 。支持在外表上创建约束 。详情请参见 10.3 节和 10.3.3 节 。
支持无日志表直接升级为日志表由于无日志表不写日志,往其中导入数据时会很快,但缺点是数据
库崩溃时会完全丢失数据 。在此前的版本中,当数据完全导入无日志表
后,要想把无日志表改为日志表需要创建一张新表,然后再把无日志表
的数据写入新表 。9.5 版提供了一个新的语法:ALTER TABLE ... SET
UNLOGGED,可以直接把无日志表修改为日志表,这样就省去了重新建
表并搬迁数据的过程 。
array_agg 函数支持数组入参
array_agg 函数可以将某字段的多条记录聚合为一个数组 。在 9.5
版之前,入参字段类型不能是一个数组,但 9.5 版之后支持输入数组入
参,这样就可以构造出多维数组 。详情请参见示例 5-17 。
支持 BRIN 索引类型
BRIN(block range index)是一种新型的索引,相比 B-树和 GIN 索
引有着更小的内存占用 。有些情况下 BRIN 索引会比前述两种索引速度
更快 。详情请参见 6.3 节 。
支持 GROUPING SETS、ROLLUP 和 CUBE 聚合语法
该特性用于聚合查询语句中,可以实现一次性获取多维度汇聚结
果 。具体例子请参见 7.7 节 。
仅索引扫描
如果要查询的字段在索引中已经全部包含,则仅扫描索引即可获得
查询结果,而不用访问表数据,这种查询模式称为“仅索引扫描” 。当前
只有 GiST 索引支持此特性 。
支持“无则插入有则更新”处理(即 UPSERT 能力)9.5
版之前,如果插入或者更新操作违反了主键约束或者其他约
束,那么该操作会失败 。9.5 版提供了一种机制,允许用户捕获该异常
并自定义替代操作或者跳过引发问题的记录 。详情请参见 7.2.11 节 。
支持跳过无法写锁定的记录
如果用户希望锁定一些记录以用于后续更新,那么可以使用
SELECT ... FOR UPDATE 来锁定这些记录 。在 9.5 版之前,如果试图
锁定的部分或者全部记录已被其他用户锁定,那么当前用户的锁定操作
就会报错 。9.5 版中提供了一个 SKIP LOCKED 子句语法,可以跳过那些
已经被别人锁定的记录,这样就不会报错 。
行级安全控制
支持对用户设置记录级的读写权限,即同一张表中,部分记录只允
许某个用户读写,另外一部分记录只允许另外一个用户读写 。在多租户
场景下,显然该功能是特别有用的;对于需要进行访问权限隔离而又无
法通过分表实现的场景,该功能也特别有价值 。
1.6.5 PostgreSQL 9.4中引入的新特性


推荐阅读