2025年9月25日: PostgreSQL 18 发布!

PostgreSQL 12 Beta 1 发布!

发布于 2019-05-23,作者 PostgreSQL 全球开发组
PostgreSQL 项目

PostgreSQL 全球开发组宣布,PostgreSQL 12 的首个 Beta 版本现已可供下载。此版本包含 PostgreSQL 12 最终版本中所有功能的预览,尽管在最终发布之前,其中一些细节可能会发生变化。

本着开源 PostgreSQL 社区的精神,我们强烈鼓励您在自己的数据库系统中测试 PostgreSQL 12 的新功能,以帮助我们消除可能存在的任何 bug 或其他问题。虽然我们不建议您在生产环境中使用 PostgreSQL 12 Beta 1,但我们鼓励您尝试用此 Beta 版本运行您典型的应用程序工作负载。

您的测试和反馈将有助于社区确保 PostgreSQL 12 版本能够保持我们提供稳定、可靠的世界领先开源关系型数据库的标准。

PostgreSQL 12 功能亮点

索引性能、功能和管理

PostgreSQL 12 通过改进标准 B-tree 索引的空间管理,提高了其整体性能。这些改进还降低了频繁修改的 B-tree 索引的大小,并提高了性能。

此外,PostgreSQL 12 增加了并发重建索引的能力,这允许您在不阻塞对索引的任何写入操作的情况下执行 REINDEX 操作。这项功能应有助于处理耗时的索引重建,在生产环境中管理 PostgreSQL 数据库时,这些重建操作可能会导致停机。

PostgreSQL 12 扩展了多种专用索引机制的能力。在 PostgreSQL 11 中引入的包含索引(即 INCLUDE 子句)现在已添加到 GiST 索引中。SP-GiST 索引现在支持对支持距离 (<->) 操作的数据类型执行 K-近邻 (K-NN) 查询。

在 PostgreSQL 12 中,创建 GiST、GIN 或 SP-GiST 索引时产生的预写日志 (WAL) 开销也大大减少,这为 PostgreSQL 集群的磁盘利用率以及连续归档和流复制等功能带来了多项好处。

内联 WITH 查询(公用表表达式)

公用表表达式(也称为 WITH 查询)现在可以自动内联到查询中,前提是它们 a) 不是递归的,b) 没有任何副作用,并且 c) 在查询的后续部分中只被引用一次。这消除了自 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 还提高了 INSERTCOPY 到分区表的性能。现在,可以在不阻塞对分区表的并发查询的情况下执行 ATTACH PARTITION。此外,PostgreSQL 12 现在允许使用外键引用分区表。

JSON 路径查询(遵循 SQL/JSON 规范)

PostgreSQL 12 现在允许按照 SQL:2016 标准中的 SQL/JSON 规范执行 JSON 路径查询。与 XML 的 XPath 表达式类似,JSON 路径表达式允许您在 JSON 文档中评估各种算术表达式和函数,并进行值比较。

可以使用 GIN 索引加速这些表达式的一个子集,从而可以对 JSON 数据集进行高性能查找。

排序规则

PostgreSQL 12 现在支持 ICU 提供的排序规则的忽略大小写和忽略音调符号的比较,也称为“非确定性排序规则”。使用这些排序规则可以方便比较和排序,但有时也可能导致性能下降,因为排序规则可能需要对字符串进行额外的检查。

最常见值扩展统计信息

在 PostgreSQL 10 中引入的 CREATE STATISTICS 用于收集更复杂的跨多个列的统计信息以改进查询规划,现在支持最常见值统计信息。这可以改善非均匀分布的查询计划。

生成列

PostgreSQL 12 允许创建 生成列,这些列使用其他列的内容通过表达式计算其值。此功能提供了存储的生成列,它们在插入和更新时计算并保存在磁盘上。虚拟生成列(仅在查询读取列时计算)尚未实现。

可插拔表存储接口

PostgreSQL 12 引入了可插拔表存储接口,允许创建和使用不同的表存储方法。可以使用 CREATE ACCESS METHOD 命令将新的访问方法添加到 PostgreSQL 集群,然后使用 CREATE TABLE 上的新 USING 子句将其添加到表中。

可以通过创建新的 表访问方法 来定义表存储接口。

在 PostgreSQL 12 中,默认使用的存储接口是 heap 访问方法,该方法目前是唯一内置的方法。

页面校验和

pg_verify_checkums 命令已重命名为 pg_checksums,现在支持在离线的 PostgreSQL 集群中启用和禁用页面校验和。以前,页面校验和只能在集群初始化时使用 initdb 启用。

认证与连接安全

GSSAPI 现在支持客户端和服务器端加密,并可以使用 hostgssenchostnogssenc 记录类型在 pg_hba.conf 文件中指定。如果 PostgreSQL 使用 OpenLDAP 编译,PostgreSQL 12 还允许基于 DNS SRV 记录发现 LDAP 服务器。

已注意到的行为变更

PostgreSQL 12 引入了多项变更,可能会影响您当前操作的行为以及管理方式。以下列出了一些变更;有关其他变更的信息,请查阅 发布说明 中“迁移到版本 12”部分。

  1. recovery.conf 配置文件现已合并到主要的 postgresql.conf 文件中。如果检测到 recovery.conf 存在,PostgreSQL 将无法启动。要将 PostgreSQL 置于非主模式,您可以使用 recovery.signalstandby.signal 文件。

您可以在此处阅读有关 归档恢复 的更多信息。

https://postgresql.ac.cn/docs/12/runtime-config-wal.html#RUNTIME-CONFIG-WAL-ARCHIVE-RECOVERY

  1. 即时(JIT)编译现已默认启用。

  2. 不再允许使用 WITH OIDS 子句将 OID 添加到用户创建的表中。使用 WITH OIDS 创建的表的列(即名为“OID”的列)上的操作需要进行调整。

在系统表上运行 SELECT * 命令现在还将输出系统表中行的 OID,而不是旧行为(需要显式指定 OID 列)。

附加功能

PostgreSQL 12 中还添加了许多其他新功能和改进,其中一些功能可能对特定用户来说与上述功能同等重要甚至更重要。请参阅 发布说明 以获取新功能和已更改功能的完整列表。

测试 Bug 和兼容性

每个 PostgreSQL 版本的稳定性在很大程度上取决于您——社区——在 PostgreSQL 12 正式发布之前,通过您的工作负载和测试工具测试即将发布的版本,以发现 bug 和回归。由于这是 Beta 版本,数据库行为、功能细节和 API 仍可能发生微小变化。您的反馈和测试将有助于确定新功能的最终调整,因此请在不久的将来进行测试。用户测试的质量有助于我们确定何时可以进行最终发布。

PostgreSQL wiki 上公开提供了一个 未解决问题列表。您可以使用 PostgreSQL 网站上的此表单 报告 bug

https://postgresql.ac.cn/account/submitbug/

Beta 时间表

这是 12 版的第一个 Beta 版本。PostgreSQL 项目将根据测试需要发布其他 Beta 版本,然后发布一个或多个候选版本,直到 2019 年底最终发布。有关更多信息,请参阅 Beta 测试 页面。

链接