内容提要
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。