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

PostgreSQL 17 Beta 1 发布!

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

PostgreSQL 全球开发组宣布,PostgreSQL 17 的第一个 beta 版本现已 可供下载。此版本包含了 PostgreSQL 17 正式发布时将提供的所有功能的预览,但发布的一些细节在 beta 期间可能会发生变化。

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

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

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

您的测试和反馈将帮助社区确保 PostgreSQL 17 版本能够保持我们提供世界上最先进的开源关系数据库的稳定、可靠版本的标准。请阅读更多关于我们的 Beta 测试流程 以及您如何贡献。

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

PostgreSQL 17 功能亮点

查询和操作性能改进

PostgreSQL 17 在近期版本的基础上继续改进整个系统的性能。Vacuum(PostgreSQL 中负责回收存储空间的进程)拥有了一个新的内部数据结构,这使得内存使用量最多可减少 20 倍,并且整体完成工作的时间也有所缩短。此外,vacuum 进程不再有 1GB 的内存使用限制(由 maintenance_work_mem 控制),让您可以选择为 vacuum 分配更多资源。

此版本引入了一个流式 I/O 接口,在执行顺序扫描和运行 ANALYZE 时可以显示性能提升。PostgreSQL 17 还包含可控制 事务、子事务和多事务缓冲区 可扩展性的配置参数。

PostgreSQL 17 现在可以同时利用规划器统计信息和 公用表表达式WITH 查询)的排序顺序来进一步优化这些查询,帮助它们更快地执行。此外,此版本显著缩短了使用带有 B-tree 索引IN 子句的查询的执行时间。从这个版本开始,PostgreSQL 可以从执行中移除对具有 NOT NULL 约束的列的冗余 IS NOT NULL 语句,并且不再需要处理包含在 IS NOT NULL 列上的 IS NULL 子句的查询。现在,PostgreSQL 17 支持对 BRIN 索引使用并行索引构建。

高度并发更改的工作负载可以受益于 PostgreSQL 17,因为 预写日志WAL)锁的管理方式得到了改进,部分测试显示性能提升高达 2 倍。

最后,PostgreSQL 17 增加了更多的显式 SIMD 指令,包括对 bit_count 函数的 AVX-512 支持。

分区和分布式工作负载增强

PostgreSQL 17 为分区管理带来了更大的灵活性,增加了拆分和合并分区的能力,并增加了对分区表标识列和排除约束的支持。此外,PostgreSQL 外部数据包装器postgres_fdw)可以从带有 EXISTSIN 子查询的查询中获得性能提升,因为这些现在可以被下推到远程服务器。

PostgreSQL 17 为逻辑复制增加了新功能,使其在高可用性工作负载和升级中更易于使用。从 PostgreSQL 17 升级到新版本时,在使用 pg_upgrade 时不再需要删除 逻辑复制槽,从而避免在升级后重新同步数据。此外,此版本引入了逻辑复制的故障转移控制,为在高可用性环境中管理 PostgreSQL 数据库提供了更多控制。PostgreSQL 17 还允许逻辑复制订阅者使用 hash 索引进行查找,并引入了 pg_createsubscriber 命令行工具,用于通过物理复制在副本上添加逻辑复制。

开发者体验

PostgreSQL 17 继续构建在 SQL/JSON 标准之上,增加了对 JSON_TABLE 功能的支持,该功能可以将 JSON 转换为标准的 PostgreSQL 表,以及 SQL/JSON 构造函数(JSONJSON_SCALARJSON_SERIALIZE)和查询函数(JSON_EXISTSJSON_QUERYJSON_VALUE)。值得注意的是,这些功能最初是为 PostgreSQL 15 版本计划的,但在 beta 期间由于设计考虑而被回滚,这也是我们要求您在 beta 期间帮助测试功能的原因之一!此外,PostgreSQL 17 为其 jsonpath 实现增加了更多功能,并支持将 JSON 值转换为不同数据类型。

MERGE 命令现在支持 RETURNING 子句,让您可以进一步处理已修改的行。您还可以使用新的 merge_action 函数来查看 MERGE 命令的哪个部分修改了行。PostgreSQL 17 还允许您使用 MERGE 命令更新视图,并添加了 WHEN NOT MATCHED BY SOURCE 子句,以便在源行不满足条件时提供行为。

COPY 用于从 PostgreSQL 高效地批量加载和导出数据,现在使用 PostgreSQL 17,在导出大型行时,您可能会看到高达 2 倍的性能提升。此外,当源编码与目标编码匹配时,COPY 的性能有所提升,并且有一个新的选项 ON_ERROR,允许在插入行出错时继续复制。PostgreSQL 17 还为 异步和更安全的查询取消例程 提供了更好的支持,驱动程序可以使用 libpq API 来采用这些例程。

PostgreSQL 17 包含一个内置的排序提供程序,该提供程序提供与 C 排序相似的排序语义,但使用 UTF-8 编码而不是 SQL_ASCII。这个新的排序保证是不可变的,确保您的排序返回值不会因 PostgreSQL 安装所在的系统而改变。

安全功能

PostgreSQL 17 添加了一个新的连接参数 sslnegotiation,它允许 PostgreSQL 在使用 ALPN 时执行直接 TLS 握手,从而消除了网络往返。PostgreSQL 在 ALPN 目录中注册为 postgresql

此版本引入了在认证期间执行的事件触发器,并且在 libpq 中包含了一个名为 PQchangePassword 的新 API,该 API 可在客户端自动对密码进行哈希处理,以防止服务器中意外记录明文密码。

PostgreSQL 17 添加了一个新的 预定义角色 pg_maintain,该角色授予用户对所有关系执行 VACUUMANALYZECLUSTERREFRESH MATERIALIZED VIEWREINDEXLOCK TABLE 的权限。此版本还确保 search_path 对于 VACUUMANALYZECLUSTERREFRESH MATERIALIZED VIEWINDEX 等维护操作是安全的。最后,用户现在可以使用 ALTER SYSTEM 来设置未识别的自定义服务器变量的值。

备份和导出管理

PostgreSQL 17 引入了使用 pg_basebackup 执行增量备份的能力,并添加了一个名为 pg_combinebackup 的新实用程序,该实用程序在备份恢复过程中使用。此版本为 pg_dump 添加了一个名为 --filter 的新标志,允许您指定一个包含要包含/排除在 dump 中的对象的指令的文件。

监控

EXPLAIN 命令(提供有关查询计划和执行的信息)增加了两个新选项:SERIALIZE,显示将数据转换为网络传输所需的时间;MEMORY,报告优化器内存使用情况。此外,EXPLAIN 现在还可以显示花费在 I/O 块读写上的时间。

PostgreSQL 17 标准化了 CALLpg_stat_statements 中的参数,减少了频繁调用的存储过程的条目数。此外,VACUUM 进度报告 现在显示索引 vacuuming 的进度。PostgreSQL 17 还引入了一个新视图 pg_wait_events,它提供了关于等待事件的描述,并且可以与 pg_stat_activity 结合使用,以更深入地了解活动会话为何在等待。此外,pg_stat_bgwriter 视图中的一些信息现在被拆分到新的 pg_stat_checkpointer 视图中。

附加功能

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

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

测试 Bug 和兼容性

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

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

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

Beta 时间表

这是 17 版本的第一个 beta 版本。PostgreSQL 项目将在测试需要时发布额外的 beta 版本,然后发布一个或多个候选版本,直到最终版本在 2024 年 9 月/10 月左右发布。更多信息请参阅 Beta 测试 页面。

链接