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

PostgreSQL 18 Beta 1 发布!

发布于 2025-05-08,作者 PostgreSQL 全球开发组
PostgreSQL 项目

PostgreSQL 全球开发组宣布 PostgreSQL 18 的第一个 Beta 版本现已 开放下载。此版本包含了 PostgreSQL 18 正式发布时所有功能的预览,尽管在 Beta 期间某些细节仍可能发生变化。

您可以在 发布说明 中找到有关 PostgreSQL 18 所有功能和变更的信息。

https://postgresql.ac.cn/docs/18/release-18.html

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

您的测试和反馈有助于社区确保 PostgreSQL 18 保持我们交付世界上最先进的开源关系型数据库的稳定、可靠的发布标准。请阅读我们关于 beta 测试过程的更多信息,以及您如何做出贡献。

https://postgresql.ac.cn/developer/beta/

PostgreSQL 18 功能亮点

以下是 PostgreSQL 18 计划中的一些功能亮点。此列表并非详尽无遗;如需完整的计划功能列表,请参阅 发布说明

性能

PostgreSQL 18 引入了异步 I/O (AIO) 子系统。这个新子系统可以提高 I/O 吞吐量并隐藏 I/O 延迟。在 Linux 上可以使用 io_uring 实现 AIO,所有平台都提供了基于 worker 的实现。此初始版本支持文件系统读取,如顺序扫描、位图堆扫描和 VACUUM 操作,测试显示性能提升高达 2-3 倍。

这些性能提升也延伸到了查询优化和新索引功能。PostgreSQL 18 增加了对多列 B-tree 索引使用“跳跃扫描”(skip scan) 的支持,这可以加快那些在索引列的某个或多个前缀上省略 "=" 条件的查询的执行速度。此版本还优化了包含 OR 和 IN (...) 语句的 WHERE 子句,以便更好地利用最近的索引改进,这也可能带来更好的查询性能。此外,PostgreSQL 在表连接的规划和执行方面也有多项性能改进,包括提高哈希连接的整体性能以及允许合并连接使用增量排序。

PostgreSQL 18 还提供了其他多种功能,可提高其他查询和维护操作的性能。PostgreSQL 18 现在支持 GIN 索引的并行构建,GIN 索引常用于 JSON 和全文数据的搜索。此版本还允许您使用非 B-tree 的唯一索引来定义分区键和物化视图。PostgreSQL 18 还提高了访问许多关系(relations)的查询的整体锁定性能,并对分区表上的查询进行了多项改进,包括增强的剪枝(pruning)和连接支持。PostgreSQL 18 在文本处理方面也有性能改进,包括对 upper/lower 函数的整体加速以及新增的内置排序规则 PG_UNICODE_FAST。

主版本升级体验

在 PostgreSQL 18 之前,执行主版本升级后的一个重要步骤是运行 ANALYZE 来生成统计信息,这是帮助 PostgreSQL 选择最有效的查询计划的关键组成部分。根据 PostgreSQL 集群的大小和整体活动情况,这可能是一个耗时的过程,并且在过程完成之前可能会影响查询性能。PostgreSQL 18 引入了在主版本升级后保留规划器统计信息的能力,这有助于升级后的集群更快地达到预期的性能状态。

此外,用于促进主版本升级的工具 pg_upgrade 增加了一些性能增强功能,以帮助加速包含大量对象(如表和序列)的升级。此版本还允许 pg_upgrade 根据 --jobs 标志的设置并行处理其检查,并增加了 --swap 标志,该标志会交换升级目录而不是复制、克隆或链接文件。

开发者体验

PostgreSQL 18 引入了虚拟生成列,它们在查询执行期间按需计算列值,而不是存储它们。这是生成列的默认选项。此外,存储的生成列现在可以进行逻辑复制。

此版本增加了在 INSERT、UPDATE、DELETE 和 MERGE 命令的 RETURNING 子句中访问前一个值 (OLD) 和当前值 (NEW) 的能力。此外,PostgreSQL 18 通过 uuidv7() 函数增加了对 UUIDv7 生成的支持,允许您生成时间戳排序的随机 UUID 以支持更好的缓存策略(此版本还将 uuidv4() 添加为 gen_rand_uuid 的别名)。

现在,在 PostgreSQL 18 中,您可以在使用非确定性排序规则的文本上执行 LIKE 比较,从而简化更复杂的模式匹配。此外,此版本还引入了 CASEFOLD 以帮助进行不区分大小写的匹配。

此版本还增加了时间约束,即范围约束,用于使用 WITHOUT OVERLAPS 子句的 PRIMARY KEY 和 UNIQUE 约束,以及使用 PERIOD 子句的外键约束。

安全功能

PostgreSQL 18 引入了 oauth 认证,它允许用户通过 PostgreSQL 扩展支持的 OAuth 2.0 机制进行身份验证。此外,PostgreSQL 18 增加了一些功能来验证和强制执行 FIPS 模式行为,并添加了 ssl_tls13_ciphers,允许用户配置服务器可以使用哪些 TLS v1.3 密码套件。

此版本弃用了 md5 密码认证,转而使用 SCRAM 认证,SCRAM 认证于 PostgreSQL 10 中首次添加。md5 认证将在未来的主版本发布中被完全移除。此外,PostgreSQL 18 在与 postgres_fdw 和 dblink 连接到远程 PostgreSQL 实例时,增加了对 SCRAM 穿透认证的支持。

监控和可观察性

PostgreSQL 18 为 EXPLAIN 工具增加了更多细节,该工具提供有关查询计划执行的信息,并且从这个版本开始,现在会自动显示在执行 EXPLAIN ANALYZE 时访问了多少个缓冲区(数据存储的基本单位)。此外,EXPLAIN ANALYZE 现在显示在索引扫描期间发生了多少次索引查找,而 EXPLAIN ANALYZE VERBOSE 包括 CPU、WAL 和平均读取统计信息。此版本还在 pg_stat_all_tables 中包含了关于 vacuum 和 analyze 表的总耗时信息,并现在显示每个连接的 I/O 和 WAL 使用情况的统计信息。

PostgreSQL 18 还提供了更多关于逻辑复制期间发生的写冲突的洞察,并将此信息同时记录在日志和 pg_stat_subscription_stats 视图中。

其他亮点

从 PostgreSQL 18 开始,数据校验和(用于验证存储数据的完整性)在新创建的 PostgreSQL 集群上默认启用。您可以使用 initdb --no-data-checksums 命令选择禁用此行为。请注意,这可能需要更改您的升级脚本。

此外,在几个约束功能方面也存在新的行为。首先,外键约束和检查约束都可以设置为 NOT ENFORCED,反之亦然,可以设置为可强制执行。此外,NOT NULL 约束现在会保留其名称(符合 SQL 标准的要求),支持 NOT VALID 和 NO INHERIT 子句,并且在与继承结合使用时行为更加一致。

pg_createsubscriber 现在支持 --all 标志,因此您可以用一个命令为实例中的所有数据库创建逻辑副本。此外,PostgreSQL 18 允许您使用 CREATE FOREIGN TABLE ... LIKE 命令,根据本地表的定义来创建外部表的模式定义。

PostgreSQL 18 还引入了新版本的 PostgreSQL 线协议 (3.2),这是自 PostgreSQL 7.4 (2003) 以来的第一个新协议版本。libpq 默认仍使用 3.0 版本,同时客户端(如驱动程序、连接池、代理)正在增加对新协议版本的支持。

附加功能

PostgreSQL 18 还增加了许多其他新功能和改进。其中许多功能可能对您的用例也很有帮助。请参阅 发布说明 以获取新功能和更改功能的完整列表。

https://postgresql.ac.cn/docs/18/release-18.html

测试 Bug 和兼容性

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

一份 待办事项列表已在 PostgreSQL Wiki 上公开。您可以使用 PostgreSQL 网站上的此表单 报告错误

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

Beta 时间表

这是 18 版本的第一个 Beta 版本。PostgreSQL 项目将在需要测试时发布额外的 Beta 版本,随后发布一个或多个 Release Candidate 版本,直至 2025 年 9 月/10 月左右的最终发布。有关更多信息,请参阅 Beta 测试页面。

链接