PostgreSQL基础知识( 十 )


9.4 版发布于 2014 年 9 月,主要包含以下新特性 。
物化视图特性的改进
在 9.3 版中,刷新物化视图期间会对其加锁并禁止访问,而加锁时
间可能会比较长,这直接导致在生产环境中物化视图的实用价值严重受
限 。9.4 版中取消了刷新时的加锁动作,因此即使是正在被刷新的物化
视图也可被访问 。但请注意:利用此特性的前提是物化视图必须拥有一
个唯一索引 。新增支持用于计算百分比的分析函数
新增了对
percentile_disc(不连续百分比)和
percentile_cont(连续百分比)这两个分析函数的支持,须配合
WITHIN GROUP (ORDER BY...) 子句使用 。PostgreSQL 专家 Hubert
Lubaczewski 在文章“Ordered Set Within Group Aggregates”中介绍了
ORDERED SET WITHIN GROUP 聚合运算 。在 9.5 之前的版本中,
PostgreSQL 并未提供过计算中位数的函数 。这是有原因的 。如果你对计
算中位数的相关算法有所了解的话,应该知道这种算法中最后都会有一
个额外的类似于“平局加时赛”的计算步骤,这个步骤的存在使得将中位
数算法实现为聚合函数非常困难 。9.5 版中引入的这两个分析函数使用
了一种快速中位数估算算法,从而绕开了前述问题 。我们将在 7.2.16 节
对这两个函数进行更深入的介绍 。
支持对视图更新操作的结果范围进行限制
创建视图时支持 WITH CHECK OPTION 子句,其作用是确保在视图
上执行更新或者插入操作时,修改后或者新插入的记录仍然在本视图可
见范围内 。详情请参见示例 7-3 。
新增对 JSONB 数据类型的支持
该数据类型是 JSON(JavaScript Object Notation)类型的二进制存
储版本 。通过 JSONB 类型可以对 JSON 格式的文档数据建立索引,并
可加快对其内部元素的访问速度 。详细信息请参考 5.6 节,同时可参考
这两篇博客文章:“Introduce jsonb: A Structured Format for Storing
JSON”以及“JSONB: Wildcard Query” 。
GIN 索引改进GIN
索引在设计时已经考虑了要适用于全文搜索、三连词处
理、hstore 键值数据库以及 jsonb 类型支持等场景 。在很多情况下你
甚至可以把它当作 B-树索引的替代品,一般来说 GIN 索引与 B-树的查
找效率相当,但占用空间更少 。9.5 版中,GIN 索引的查询速度被进一
步提升 。详情请参见“GIN as a Substitute for Bitmap Indexes”这篇文章的
介绍 。
支持更多 JSON 函数
具体包括
json_build_array、json_build_object、json_object、json_to_record
和 json_to_recordset 等几个函数 。
加速跨表空间的对象搬迁
支持使用以下语法轻松地将所有数据库对象从一个表空间移动到另
一个表空间:ALTER TABLESPACE old_space MOVE ALL TO
new_space; 。
支持对返回的结果集中的记录加上数字编号
现在可以为查询结果中的记录添加行号 。行号用系统字段
ordinality(该字段是在 ANSI SQL 标准中定义的)表示 。当需要将
存储为数组、hstore 键值对或者复合类型的非格式化数据转换为格式
化记录时,该功能特别有用 。以下是一个使用 hstore 的例子:
SELECT ordinality, key, value
FROM each('breed=>pug,cuteness=>high'::hstore) WITH ordinality;
支持通过执行 SQL 命令来更改系统配置设置利用 ALTER system SET ... 语法,无须修改 postgresql.conf 文件
即可设置全局系统配置 。postgresql.conf
文件具体的修改方法请参见
2.1.2
节 。这也意味着用户可以通过编程的方式动态地调整系统配置
项,但请注意:有的配置项修改后需要重启数据库才能生效 。
触发器功能增强
9.4 版中支持了对外部表创建触发器 。
数据行转列能力增强
unnest 函数用于实现数据的行转列操作,即将一个横向的数组转
换为纵向的一个字段的多行记录 。该函数可接受多个数组作为入参,每
个数组转换后成为单独的一列,即输入几个数组转换后就有几列 。如果
每个数组的元素个数不一样,9.4 版之前转换后的结果是不可预知的,
9.4
版本后这种情况下转换的结果是可预知的,会以最长的数组为标
准,其他不足此长度的数组元素补 null 。
新增 ROWS FROM 语法
该语法可以将多个函数返回的结果集逐行拼接起来,最后作为一个
完整的结果集返回,因此即使这些结果集之间的元素个数不一致也没关


推荐阅读