PostgreSQL 17 Beta 1 发布!

发布于 2024-05-23,由 PostgreSQL 全球开发组发布
PostgreSQL 项目

PostgreSQL 全球开发组宣布 PostgreSQL 17 的第一个 Beta 版本现已可供下载。此版本包含 PostgreSQL 17 正式发布时将提供的所有功能的预览,尽管在 Beta 测试期间可能会更改一些发布细节。

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

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

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

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

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

PostgreSQL 17 功能亮点

查询和操作性能改进

PostgreSQL 17 基于最近的版本,并继续提高整个系统的性能。Vacuum,PostgreSQL 负责回收存储空间的过程,有一个新的内部数据结构,已显示出内存减少高达 20 倍,同时还改进了完成其工作的总体时间。此外,vacuum 进程不再对其可以使用的内存有限制 1GB(由maintenance_work_mem控制),让您可以选择将更多资源应用于 vacuum。

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

PostgreSQL 17 现在可以使用规划器统计信息和公共表表达式WITH查询)的排序顺序,以进一步优化这些查询并帮助它们更快地执行。此外,此版本显著提高了使用带有B 树索引IN 子句的查询的执行时间。从这个版本开始,PostgreSQL 可以从具有 NOT NULL 约束的列的执行中删除冗余的 IS NOT NULL 语句,并且不再需要对包含 IS NULL 子句的 IS NOT 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 转换为标准 PostgreSQL 表的 JSON_TABLE 功能以及 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,它会自动在客户端对密码进行哈希处理,以防止服务器中意外记录纯文本。

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

备份和导出管理

PostgreSQL 17 引入了使用pg_basebackup执行增量备份的功能,并添加了一个名为pg_combinebackup的新实用程序,该实用程序用作备份恢复过程的一部分。此版本为pg_dump添加了一个新标志 --filter,允许您指定一个文件,其中包含有关要从转储中包括/排除哪些对象的说明。

监控

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

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

其他功能

PostgreSQL 17 中添加了许多其他新功能和改进。其中许多可能对您的用例也有帮助。有关新的和已更改功能的完整列表,请参见发行说明

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

错误和兼容性测试

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

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

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

Beta 发布时间表

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

链接