内容提要
PostgreSQL 19首个候选版已发布,正式版预计11月19日推出,生产环境仍应使用18版。因可靠性优先,SQL属性图查询、分区合并拆分等功能被撤回。新特性包括:REPACK CONCURRENTLY可在线回收表空间,但最终切换仍需排他锁;pg_plan_advice可约束查询计划;autovacuum支持并行索引清理并按评分优先排序;逻辑复制可同步序列值,但发布端须为19版且非持续同步。此外JIT默认关闭。建议在非生产环境用真实负载充分测试。
延伸解读
功能撤回背后的可靠性优先逻辑
PostgreSQL 19 撤回了 SQL 属性图查询、分区合并拆分等多项已进入 Beta 的功能,社区明确表示可靠性优先于功能数量。文章进一步指出,AI 辅助审查加快了边缘案例的发现速度,但也带来调查、修复和评审能力的压力。对用户而言,这意味着不必将撤回简单视为失败,而应关注最终候选版的稳定性,并在测试中重点验证那些历经反复修改的特性。
REPACK CONCURRENTLY 并非零锁操作
REPACK CONCURRENTLY 允许在大部分重写过程中继续读写,但最终切换表与索引仍需 ACCESS EXCLUSIVE 锁,且需要额外临时磁盘空间。文档还警告,在重打包开始前获取的快照可能看到旧的可见性行为。因此,测试时应选择更新频繁的代表性表,在真实写入和长事务下测量回收空间、临时存储、应用延迟以及最终锁的影响,并准备回滚方案。
计划建议是约束而非性能开关
pg_plan_advice 允许用户描述、复现并约束规划器的具体决策,如连接顺序和扫描方式,配合 pg_stash_advice 可按查询标识自动应用。这有助于从计划回归中恢复或稳定特定查询。但它并不替代规划器,也不保证每次执行计划完全相同;随着数据变化,曾经有益的约束可能阻止规划器选择更优方案。测试应从曾导致问题的查询开始,使用代表性数据和参数,保持干预最小化,并持续观察其有效性。
逻辑复制序列同步的边界条件
PostgreSQL 19 支持将序列值从发布端同步到订阅端,可在创建订阅时初始同步,也可通过 ALTER SUBSCRIPTION ... REFRESH SEQUENCES 重新同步。但有两个关键限制:发布端必须运行 PostgreSQL 19 或更高版本,仅升级订阅端无效;且序列值在发布端继续推进后可能再次不同步,这不是持续同步。因此,应演练迁移或切换流程中的序列处理部分,检查序列定义匹配、同步完成情况以及应用后续生成的值。
Q&A
PostgreSQL 19 正式版什么时候发布?现在生产环境应该用哪个版本?
PostgreSQL 19 首个候选版已于10月15日发布,社区计划11月12日发布第二个候选版,正式版预计11月19日推出。在19正式发布前,生产环境仍应使用PostgreSQL 18。
为什么PostgreSQL 19撤回了SQL属性图查询、分区合并拆分等特性?
社区以可靠性优先并坚持可预测的发布节奏,部分特性需要比本周期更多的开发和评审。此外还有架构问题、AI辅助评审发现更多边缘情况、资深开发者花大量时间处理安全修复等重叠压力,导致这些特性被撤回。
REPACK CONCURRENTLY 能在线整理表吗?会不会锁表?
REPACK CONCURRENTLY 在大部工作期间允许读写继续,并发变更通过逻辑解码捕获并在完成前应用。但它并非无锁:最终的表和索引切换仍需ACCESS EXCLUSIVE锁,还需要临时磁盘空间,且文档警告使用旧快照的事务存在可见性行为问题。
pg_plan_advice 是做什么的?能用来强制固定执行计划吗?
pg_plan_advice 让用户描述、复现和约束特定的计划器决策(如连接顺序和扫描方法),EXPLAIN (PLAN_ADVICE) 可生成建议字符串,pg_stash_advice 可按查询标识存储并自动应用,用于恢复计划变更导致的性能回退。但它不是通用性能开关,也不保证每次执行计划完全相同;数据变化后,曾经有用的限制可能阻止计划器选择更优方案,文档明确警告不要不加权衡地覆盖。
PostgreSQL 19 的 autovacuum 有哪些改进?
autovacuum 可以使用并行工作进程进行索引清理和清理工作,并引入评分系统对 vacuum 和 analyze 工作排优先级,优先级通过 pg_stat_autovacuum_scores 视图暴露。这是有针对性的并行,并非所有 vacuum 阶段都并行。
逻辑复制同步序列值有什么限制?发布端必须是19版吗?
是的,发布端必须运行PostgreSQL 19或更高版本,仅升级订阅端无法对旧版发布端启用该功能。初始同步可在创建订阅时进行,之后可用 ALTER SUBSCRIPTION ... REFRESH SEQUENCES 重新同步已知序列。但序列值可能随发布端推进再次不同步,这不是持续同步,不能替代切换流程的考虑。
PostgreSQL 19 默认关闭了JIT,这对分析型负载有什么影响?
PostgreSQL 19 默认禁用JIT编译。受益于JIT的分析型工作负载团队应显式评估该设置,而不是假设现有行为会延续。