Christoph Berg:CYBERTEC 对 PostgreSQL 19 的贡献

Christoph Berg:CYBERTEC 对 PostgreSQL 19 的贡献

💡 原文英文,约2600词,阅读约需10分钟。
📝

内容提要

PostgreSQL 19 已功能冻结,CYBERTEC 贡献显著:pg_squeeze 被整合为内置 REPACK 命令,支持 CONCURRENTLY 在线整理表;延迟多年的 eager aggregation 优化落地。此外,log_lock_waits 默认开启,JIT 因成本估算不可靠改为默认关闭,并修复了 NUMA、CHECKPOINT 等多个问题。

🔎

延伸解读

REPACK CONCURRENTLY 的实用价值与当前限制

pg_squeeze 被整合为内置 REPACK 命令,并支持 CONCURRENTLY 在线整理表,这为无法承受 VACUUM FULL 排他锁的生产环境提供了新选择。但文章指出,目前每个数据库同时只能运行一个 REPACK CONCURRENTLY,且功能仍在稳定化中,存在发布前被回退的可能。读者在规划维护窗口时,需关注这些限制和后续优化。

JIT 默认关闭:成本估算不可靠的应对

JIT 的启用完全基于查询的估算成本,而估算可能严重偏离实际,导致短查询被错误编译,将 10ms 的 OLTP 查询变成 1s 的性能杀手。社区讨论后决定默认关闭 JIT,除非运行 OLAP 负载。这一变更由多个公司的开发者共同推动,反映了对生产环境稳定性的重视。

log_lock_waits 默认开启:可观测性提升

log_lock_waits 将在 PostgreSQL 19 中默认开启,这意味着查询等待锁的情况会被自动记录到服务器日志。此前该参数默认关闭,需要手动调整。对于诊断性能问题,这一改变降低了门槛,使 DBA 能更早发现锁竞争,而不必事先修改配置。

NUMA 与 CHECKPOINT 修复:跨环境兼容性挑战

文章详细描述了 NUMA 可观测性功能在 32 位系统、Docker 环境及真实硬件上暴露的问题,涉及内核 bug 和 libnuma 行为差异,最终通过内核补丁和 PostgreSQL 端变通方案解决。同时,CHECKPOINT 命令新增 FLUSH_UNLOGGED 等选项,可加速使用 unlogged 表的数据库关闭过程。这些工作体现了对多样部署环境的持续适配。

Q&A

PostgreSQL 19 中 CYBERTEC 贡献的 REPACK 命令是什么?它和 VACUUM FULL 有什么区别?

REPACK 是 PostgreSQL 19 新增的内置 SQL 命令,吸收了 VACUUM FULL 和 CLUSTER 的功能。与 VACUUM FULL 需要排他锁不同,REPACK 支持 CONCURRENTLY 选项,可以在线整理表:创建新表、设置逻辑复制、复制数据,最后快速交换表。

PostgreSQL 19 中 eager aggregation 优化是什么?它有什么作用?

eager aggregation 是 PostgreSQL 19 引入的优化,允许查询规划器将聚合操作下推到连接之前,从而更早地计算聚合,提升查询性能。该补丁最初由 Antonin Houska 于 2017 年提交,但直到 PostgreSQL 19 才被 Richard Guo 采纳并重写后合并。

为什么 PostgreSQL 19 将 JIT 编译默认关闭?

JIT 编译的启用基于查询的估算执行成本,但估算可能严重偏差,导致短查询触发 JIT,将 10ms 的 OLTP 查询变成 1s 的负担。社区讨论后,包括 JIT 原作者 Andres Freund 指出 LLVM 编译器本身已变化,成本模型需重新考虑,因此决定默认关闭 JIT。

PostgreSQL 19 中 log_lock_waits 参数有什么变化?

log_lock_waits 参数在 PostgreSQL 19 中默认开启。此前该参数默认关闭,导致查询等待锁时不会记录日志。Laurenz Albe 推动了这一变更,使得默认情况下就能记录锁等待信息,有助于性能诊断。

CYBERTEC 在 PostgreSQL 19 中修复了哪些 NUMA 相关问题?

CYBERTEC 的 Christoph Berg 和 Tomas Vondra 等人修复了 NUMA 支持中的多个问题:32 位系统上内核系统调用的 32/64 位混淆导致 NUMA 节点号错误;Docker 环境中 libnuma 版本问题;以及 pg_shmem_allocations_numa 视图在负载下无法可靠分配页面的问题。他们还提交了 Linux 内核补丁修复长期存在的内核 bug。

PostgreSQL 19 中 CHECKPOINT 命令增加了哪些新选项?

PostgreSQL 19 为 CHECKPOINT 命令增加了选项列表,包括 MODE 选项(用于请求 spread checkpoint)和 FLUSH_UNLOGGED 选项(用于在关闭前刷新 unlogged 表以加速关闭)。此外,还重命名了 CHECKPOINT_FLUSH_ALL 为 CHECKPOINT_FLUSH_UNLOGGED,CHECKPOINT_IMMEDIATE 为 CHECKPOINT_FAST。

🏷️

标签

➡️

继续阅读