PostgreSQL 全球开发组宣布,PostgreSQL 17 的第一个候选版本RC1现已开放下载[1]。作为候选版本,PostgreSQL 17 RC 1 将与 PostgreSQL 17 的初始版本基本相同,但在 PostgreSQL 17 正式发布之前可能会应用一些修复。
PostgreSQL 17 的正式发布计划日期为 2024 年 9 月 26 日。
PG相关新闻
近期与 PostgreSQL 相关的新闻包括:
PostgreSQL 17 RC1 发布,有性能评测表明 PG17 写入性能(吞吐量)有非常显著(最高达50%+)的提升。
但是请注意,对于普通用户来说,刚发布的全新大版本不适合立即投入生产。目前 PostgreSQL 17 生态可用的扩展支持尚不完全。建议普通用户在 PostgreSQL 17 扩展支持基本达到 16 目前的状态再正式投入生产。(预计明年年中)
开箱即用的 PostgreSQL 发行版 —— Pigsty 发布了 v3.0.1 版本,提供了 336 个开箱即用的扩展插件与 6 种 PG 可替换内核。v3.0 提供了对 PostgreSQL 17 的支持 —— 包括全新的监控指标与面板。(当然,正式将 PG 17 作为默认大版本,需要等到 17 完全成熟以后)
MongoDB 的 CEO 对 PostgreSQL “宣战”,要乱拳打死老师傅。当然这种无聊的营销碰瓷就要用霹雳手段及时遏止 —— 请看《MongoDB没有未来:好营销救不了烂芒果》
此外基于 PostgreSQL 的 MongoDB 替代组件 —— FerretDB 1.24 发布,FerretDB 提供了 MongoDB 线缆协议仿真并实现了大量 Mongo API。另一个在 Node.js 客户端侧基于 PG 提供 Mongo 仿真的开源项目 PongoDB 发布了 0.13 版本。
TimescaleDB 开始了 2024 年的 PostgreSQL 社区调研,作为一个专门针对 PG 社区的老牌调研,我呼吁中国的 PostgreSQL 积极参与问卷调研,并发出自己的声音: https://www.timescale.com/blog/the-2024-state-of-postgresql-survey-is-now-open/ 。此外,RedGate 也在进行另一个数据库生态的问卷调查。
PostgreSQL SOTA 高可用组件 Patroni 已经升级到 4.0,目前已经在 PGDG YUM 仓库实装,并在 Pigsty v3.0.1 中提供原生部署支持。不过目前 APT 仓库仍然尚未跟进。
由阿里云开源的 PolarDB for PostgreSQL 目前将 15 版本的内核正式发布并开源。上一个发布的版本还是基于 PostgreSQL 11,已经 EOL 进一年,并缺失了一些重要可观测性指标。这个新版本有力的解决了这些痛点。目前 PolarDB 15 尚未提供 RPM / DEB 包,不过 Pigsty 中提供 PolarDB 11 的原生支持,欢迎试用与尝鲜。
PostgreSQL 17 亮点功能
查询和写入性能改善
PostgreSQL 17 最近的版本与构建,持续致力于整体的系统性能优化。负责回收存储空间的 PostgreSQL Vacuum[4] 进程使用了新的内部数据结构,使得垃圾回收过程的内存使用减少,最高可以减少 20 倍,同时减少了执行所需的时间。此外 Vacuum 进程不再受到 1GB
内存的使用限制,而由 maintenance_work_mem
[5] 来控制,这意味着您可以为 Vacuum 进程分配更多资源。
这个版本引入了流式 I/O 接口,使得执行顺序扫描和运行 ANALYZE
[6] 的性能有所提高。PostgreSQL 17 还新增了配置参数,可控制 事务、子事务和 multixact 缓冲区[7] 的大小。
PostgreSQL 17 现在可以同时利用 Planner 的统计信息与 公共表表达式 CTE[8](即 WITH
查询[9])结果中的排序顺序,进一步优化这些查询的速度。此外,这个版本显著提高了带有 IN
子句的查询,在使用 B-tree 索引[10] 时的查询执行时间。从这个版本开始,对于那些带有 NOT NULL
约束的列,如果查询中带有冗余的 IS NOT NULL
语句,PostgreSQL 会直接把它优化掉,同理,那些带有 IS NULL
的查询也会直接优化掉,PostgreSQL 17 还支持并行构建 BRIN[11] 索引。
高并发写入类的工作负载,可以显著受益于 PostgreSQL 17 的预写日志(WAL[12])锁管理改进,测试显示,性能提升 最多高达两倍。
最后,PostgreSQL 17 添加了更多显式的 SIMD 指令,比如为 bit_count
[13] 函数启用 AVX-512 指令支持。
分区和分布式工作负载增强
PostgreSQL 17 的分区管理更为灵活,新增了拆分与合并分区的能力,并允许分区表使用 身份列(Identity Column) 和排它约束(Exclude Constraints)。此外,PostgreSQL 外部数据包装器[14](postgres_fdw
[15])现在可以将 EXISTS
和 IN
子查询下推到远端服务器,从而提升性能。
PostgreSQL 17 为逻辑复制添加了新功能,使其在高可用架构和大版本升级中更加易用。从 PostgreSQL 17 使用 pg_upgrade
[16] 升级到更高版本时,不再需要删除 逻辑复制槽[17] 了,从而避免了升级后需要重新同步数据的麻烦。此外,你还可以控制逻辑复制的 Failover 过程,为高可用性架构中管理 PostgreSQL 提供了更好的可控制性。PostgreSQL 17 还允许逻辑复制的订阅者使用 hash
索引进行查找,并引入了 pg_createsubscriber
命令行工具,用于在使用物理复制的副本从库上创建逻辑复制。
开发者体验
PostgreSQL 17 继续深化了对 SQL/JSON 标准的支持,新增了 JSON_TABLE
功能,可以将 JSON 转换为标准的 PostgreSQL 表,以及 SQL/JSON 构造函数(JSON
、JSON_SCALAR
、JSON_SERIALIZE
)和查询函数(JSON_EXISTS
、JSON_QUERY
、JSON_VALUE
)。值得注意的是,这些功能最初计划在 PostgreSQL 15 中发布,但出于设计权衡考虑,在 Beta 期间被撤回 —— 这也是我们希望请您在 Beta 期间帮忙测试新功能的原因之一!此外,PostgreSQL 17 为 jsonpath
的实现增添了更多功能,包括将 JSON 类型的值转换为各种不同特定数据类型的能力。
MERGE
[18] 命令现在支持 RETURNING
子句了,让您可以在同一条命令中进一步处理修改过的行。您还可以使用新的 merge_action
函数查看 MERGE
命令修改了哪一部分。PostgreSQL 17 还允许使用 MERGE
命令更新视图,并新增了 WHEN NOT MATCHED BY SOURCE
子句,允许用户指定当源中的行没有任何匹配时,应该执行什么操作。
COPY
[19] 命令用于高效地从 PostgreSQL 批量加载与导出数据。在 PostgreSQL 17 中,导出大行时的性能最多有两倍的提升。此外,当源编码与目标编码相匹配时,COPY
的性能也有所提升。COPY 新增了一个 ON_ERROR
选项,即使插入行时出现错误也可继续进行。此外在 PostgreSQL 17 中,驱动程序可以利用 libpq API 使用 异步和更为安全的查询取消方法[20]。
PostgreSQL 17 引入了内置的排序规则提供程序,该提供程序提供与 C
排序规则类似的排序语义,但编码为 UTF-8
而非 SQL_ASCII
。这种新的排序规则提供了不变性保证,确保您的排序结果在不同系统上都不会改变。
安全功能
PostgreSQL 17 新增了一个新的连接参数 sslnegotation
,允许 PostgreSQL 在使用 ALPN[21] 时直接进行 TLS 握手,减少一次网络往返。PostgreSQL 会在 ALPN 目录中注册为 postgresql
。
这个版本引入了新的 EventTrigger 事件 —— 当用户认证时触发。并且在 libpq 中提供了一个新的名为 PQchangePassword
的 API,可以在客户端侧自动对密码取哈希,以防止在服务器中意外记录下明文密码。
PostgreSQL 17 增加了一个新的 预定义角色[22],名为 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
[23] 进行增量备份,并增加了一个新的实用工具 pg_combinebackup
[24],用于备份恢复过程中将备份合并。该版本为 pg_dump
[25] 新增了一个参数项 --filter
,允许您指定一个文件来进一步指定在 dump 过程中要包含或排除哪些对象。
监控
EXPLAIN
[26] 命令可以提供有关查询计划和执行详情的信息,现在它新增了两个选项:SERIALIZE
会显示将数据序列化为网络传输形式时的耗时;MEMORY
会报告优化器内存使用情况。此外,EXPLAIN
现在还可以显示花费在 I/O 块读写上的时间。
PostgreSQL 17 标准化了 pg_stat_statements
[27] 中 CALL
的参数,减少了频繁调用的存储过程所产生的记录数量。此外,VACUUM
进度报告[28] 现在会显示索引垃圾回收的进度。PostgreSQL 17 还引入了一个新视图,pg_wait_events
[29],提供关于等待事件的描述,可以与 pg_stat_activity
共同使用,以便深入了解活动会话出现等待的原因。此外,pg_stat_bgwriter
[30] 视图中的一些信息,现在被拆分到新的 pg_stat_checkpointer
[31] 视图中了。
其他功能
PostgreSQL 17 还有许多其他新功能与改进,很多改进都可能会对您的用例有所帮助。请参阅发布说明[32]以获取完整的新功能和变更列表:
https://www.postgresql.org/docs/17/release-17.html
错误和兼容性测试
每个 PostgreSQL 版本的稳定性,在很大程度上依赖于诸位 PG社区用户,您可以用你们的工作负载和测试工具来测试即将发布的版本,以便在 PostgreSQL 17 正式发布前发现错误并完成回归。由于这是一个 Beta 版本,针对数据库行为、功能细节和 API 的小改动仍然可能会发生。您的反馈和测试将有助于调整并敲定这些新功能,因此请在近期进行测试。用户测试的质量有助于我们确定何时可以进行最终发布。
PostgreSQL wiki 中公开提供了开放问题[33]列表。您可以使用 PostgreSQL 网站上的此表单报告错误[34]:
https://www.postgresql.org/account/submitbug/
References
[1]
下载: https://www.postgresql.org/about/news/postgresql-17-rc1-released-2926/[2]
发布说明: https://www.postgresql.org/docs/17/release-17.html[3]
Beta 测试流程: https://www.postgresql.org/developer/beta/[4]
Vacuum: https://www.postgresql.org/docs/17/routine-vacuuming.html[5]
maintenance_work_mem
: https://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM[6]
ANALYZE
: https://www.postgresql.org/docs/17/sql-analyze.html[7]
事务、子事务和 multixact 缓冲区: https://www.postgresql.org/docs/17/runtime-config-resource.html#GUC-MULTIXACT-MEMBER-BUFFERS[8]
公共表表达式 CTE: https://www.postgresql.org/docs/17/queries-with.html[9]
WITH
查询: https://www.postgresql.org/docs/17/queries-with.html[10]
B-tree 索引: https://www.postgresql.org/docs/17/indexes-types.html#INDEXES-TYPES-BTREE[11]
BRIN: https://www.postgresql.org/docs/17/brin.html[12]
WAL: https://www.postgresql.org/docs/17/wal-intro.html[13]
bit_count
: https://www.postgresql.org/docs/17/functions-bitstring.html[14]
PostgreSQL 外部数据包装器: https://www.postgresql.org/docs/17/postgres-fdw.html[15]
postgres_fdw
: https://www.postgresql.org/docs/17/postgres-fdw.html[16]
pg_upgrade
: https://www.postgresql.org/docs/17/pgupgrade.html[17]
逻辑复制槽: https://www.postgresql.org/docs/17/logical-replication-subscription.html#LOGICAL-REPLICATION-SUBSCRIPTION-SLOT[18]
MERGE
: https://www.postgresql.org/docs/17/sql-merge.html[19]
COPY
: https://www.postgresql.org/docs/17/sql-copy.html[20]
异步和更为安全的查询取消方法: https://www.postgresql.org/docs/17/libpq-cancel.html[21]
ALPN: https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation[22]
预定义角色: https://www.postgresql.org/docs/17/predefined-roles.html[23]
pg_basebackup
: https://www.postgresql.org/docs/17/app-pgbasebackup.html[24]
pg_combinebackup
: https://www.postgresql.org/docs/17/app-pgcombinebackup.html[25]
pg_dump
: https://www.postgresql.org/docs/17/app-pgdump.html[26]
EXPLAIN
: https://www.postgresql.org/docs/17/sql-explain.html[27]
pg_stat_statements
: https://www.postgresql.org/docs/17/pgstatstatements.html[28]
VACUUM
进度报告: https://www.postgresql.org/docs/devel/progress-reporting.html#VACUUM-PROGRESS-REPORTING[29]
pg_wait_events
: https://www.postgresql.org/docs/17/view-pg-wait-events.html[30]
pg_stat_bgwriter
: https://www.postgresql.org/docs/17/monitoring-stats.html#MONITORING-PG-STAT-BGWRITER-VIEW[31]
pg_stat_checkpointer
: https://www.postgresql.org/docs/17/monitoring-stats.html#MONITORING-PG-STAT-CHECKPOINTER-VIEW[32]
发布说明: https://www.postgresql.org/docs/17/release-17.html[33]
开放问题: https://wiki.postgresql.org/wiki/PostgreSQL_17_Open_Items[34]
报告错误: https://www.postgresql.org/account/submitbug/[35]
Beta 测试: https://www.postgresql.org/developer/beta/[36]
下载: https://www.postgresql.org/download/[37]
Beta 测试信息: https://www.postgresql.org/developer/beta/[38]
PostgreSQL 17 Beta 发布说明: https://www.postgresql.org/docs/17/release-17.html[39]
PostgreSQL 17 开放问题: https://wiki.postgresql.org/wiki/PostgreSQL_17_Open_Items[40]
功能矩阵: https://www.postgresql.org/about/featurematrix/[41]
提交错误: https://www.postgresql.org/account/submitbug/[42]
在 X/Twitter 上关注 @postgresql: https://twitter.com/postgresql[43]
捐赠: https://www.postgresql.org/about/donate/
数据库老司机
对 PostgreSQL 与 Pigsty 感兴趣的朋友
欢迎加入 PGSQL x Pigsty 交流群(备注加群)
(这个小助手很懒,请使劲拍打他)
世界上最流行的数据库 PostgreSQL
StackOverflow 2024调研:PostgreSQL已经超神了
PostgreSQL小版本更新,17beta3,12将EOL
PostgreSQL 17 Beta1 发布!牙膏管挤爆了!
PostgreSQL is eating the database world
开箱即用的 PostgreSQL 数据库发行版 Pigsty
Pigsty v2.6:PostgreSQL 踢馆 OLAP
Pigsty v2.5 发布:Ubuntu/Debian与监控改版/新扩展
Pigsty v2.3.1:HNSW版PGVECTOR来了!
国产数据库专辑
其他数据库