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 基于最近的版本,并继续提高整个系统的性能。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
)可以通过 EXISTS
和 IN
子查询实现性能优势,因为这些子查询现在可以下推到远程服务器。
PostgreSQL 17 为逻辑复制添加了新功能,使其更容易在高可用性工作负载和升级中使用。从 PostgreSQL 17 升级到更新版本开始,在使用pg_upgrade
时,您不再需要删除逻辑复制槽,从而避免在升级后重新同步数据。此外,此版本为逻辑复制引入了故障转移控制,为在高可用性环境中管理 PostgreSQL 数据库提供了更多控制。PostgreSQL 17 还允许逻辑复制订阅者使用 hash
索引进行查找,并引入了 pg_createsubscriber
命令行工具,用于在使用物理复制的副本上添加逻辑复制。
PostgreSQL 17 继续基于 SQL/JSON 标准进行构建,增加了对可以将 JSON 转换为标准 PostgreSQL 表的 JSON_TABLE
功能以及 SQL/JSON 构造函数(JSON
、JSON_SCALAR
、JSON_SERIALIZE
)和查询函数(JSON_EXISTS
、JSON_QUERY
、JSON_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
,该角色允许用户对所有关系执行 VACUUM
、ANALYZE
、CLUSTER
、REFRESH MATERIALIZED VIEW
、REINDEX
和 LOCK TABLE
。此版本还确保 search_path
对于诸如 VACUUM
、ANALYZE
、CLUSTER
、REFRESH MATERIALIZED VIEW
和 INDEX
之类的维护操作是安全的。最后,用户现在可以使用 ALTER SYSTEM
来设置无法识别的自定义服务器变量的值。
PostgreSQL 17 引入了使用pg_basebackup
执行增量备份的功能,并添加了一个名为pg_combinebackup
的新实用程序,该实用程序用作备份恢复过程的一部分。此版本为pg_dump
添加了一个新标志 --filter
,允许您指定一个文件,其中包含有关要从转储中包括/排除哪些对象的说明。
提供有关查询计划和执行信息的EXPLAIN
命令添加了两个新选项:SERIALIZE
,它显示了转换用于网络传输的数据所花费的时间;MEMORY
,它报告优化器的内存使用情况。此外,EXPLAIN
现在可以显示 I/O 块读取和写入所花费的时间。
PostgreSQL 17 规范化了pg_stat_statements
中 CALL
的参数,从而减少了频繁调用的存储过程的条目数量。此外,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/
这是 17 版本的第一个 beta 版本。 PostgreSQL 项目将根据测试需要发布额外的 beta 版本,然后发布一个或多个候选版本,直到 2024 年 9 月/10 月左右的最终版本。 更多信息请查看Beta 测试页面。