PostgreSQL 12 beta 1 已经登场,该版包含 PostgreSQL 12 最终版本可用的所有功能的预览,但某些细节可能会在 12 正式发布之前发生变化。
新特性包括:
索引性能、功能和管理
PostgreSQL 12 改进了标准 B 树索引的整体性能,同时改进了这些索引的空间管理。除了性能提升之外,这些改进还减少了需要经常修改的 B 树索引的大小。
此外,PostgreSQL 12 还增加了并发重建索引的功能,这使得可以在不阻止对索引进行任何写入的情况下执行 REINDEX 操作。此功能应该有助于在生产环境中管理 PostgreSQL 数据库时可能导致停机的冗长索引重建。
PostgreSQL 12 扩展了几种专用索引机制的功能。创建覆盖索引的能力,即 PostgreSQL 11 中引入的 INCLUDE 子句,现已添加到 GiST 索引中。SP-GiST 索引现在支持对支持距离(<->)操作的数据类型执行 K 近邻(K-NN)查询的能力。
创建 GiST、GIN 或 SP-GiST 索引时生成的预写日志(WAL)开销量在 PostgreSQL 12 中也显着降低,这提高了 PostgreSQL 集群的磁盘利用率,同时为连续存档与流复制等功能提供了多种好处。
内联 WITH 查询(公用表表达式)
公共表表达式(也称为 WITH 查询)现在满足以下几个条件则可以在查询中自动内联:
不是递归的
没有任何副作用
仅在查询的后续部分引用一次
这将删除 PostgreSQL 8.4 中引入 WITH 子句以来一直存在的“优化范围”选项。
如果需要,可以使用 MATERIALIZED 子句强制 WITH 查询实现:
WITH c AS MATERIALIZED ( SELECT * FROM a WHERE a.x % 4 = 0 ) SELECT * FROM c JOIN d ON d.y = a.x;
分区
PostgreSQL 12 在处理具有数千个分区的表时,性能提高了,并且只需要使用少量分区操作。PostgreSQL 12 还改进了 INSERT 和 COPY 在分区表中的性能。现在可以在不阻塞分区表上的并发查询的情况下执行 ATTACH PARTITION。此外,PostgreSQL 12 现在允许使用外键来引用分区表。
SQL/JSON 的 JSON 路径查询规范
PostgreSQL 12 现在允许根据 SQL:2016 标准中的 SQL/JSON 规范执行 JSON 路径查询。与 XML 的 XPath 表达式类似,除了比较 JSON 文档中的值之外,JSON 路径表达式还允许评估各种算术表达式和函数。
可以使用 GIN 索引加速这些表达式的子集,从而允许跨多组 JSON 数据执行高性能查找。
排序规则
PostgreSQL 12 现在支持对 ICU 提供的排序规则进行不区分大小写和重音不敏感的比较,也称为“非确定性排序规则”。使用时,这些排序规则可以为比较和排序提供便利,但也可能导致性能损失,因为排序规则可能需要对字符串进行额外检查。
可插拔表存储接口
PostgreSQL 12 引入了可插入表存储接口,允许创建和使用不同的表存储方法。可以使用 CREATE ACCESS METHOD 命令将新的访问方法添加到 PostgreSQL 集群,然后将其添加到 CREATE TABLE 上具有新 USING 子句的表中。
可以通过创建新的表访问方法来定义表存储接口。在 PostgreSQL 12 中,默认使用的存储接口是堆访问方法,它目前是唯一的内置方法。
页面校验和
pg_verify_checkums 命令已重命名为 pg_checksums,现在支持在脱机的 PostgreSQL 集群中启用和禁用页面校验和的功能。
认证和连接安全
GSSAPI 现在支持客户端和服务器端加密,可以使用 hostgssenc 和 hostnogssenc 记录类型在 pg_hba.conf 文件中指定。如果使用 OpenLDAP 编译 PostgreSQL,PostgreSQL 12 还允许基于 DNS SRV 记录发现 LDAP 服务器。