预备语句执行到第六次会悄悄换成通用计划
plan_cache_mode 默认取 auto:预备语句前五次用带参数值的定制计划,第六次才评估一份通用计划,只要通用计划的代价不高于定制计划的平均代价,本会话此后就固定用它。Richard Yen 用 pgbench 构造了 99.9% 取 Y、0.1% 取 N 的倾斜列:查 Y 时定制计划走顺序扫描,通用计划却按 50% 选择率估算而选了索引扫描,第六次之后永久切过去,于是同一条查询在数据没变的情况下突然变慢。数据分布越倾斜,这个坑越深。
pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
每日精选 PostgreSQL、数据库与云计算资讯
plan_cache_mode 默认取 auto:预备语句前五次用带参数值的定制计划,第六次才评估一份通用计划,只要通用计划的代价不高于定制计划的平均代价,本会话此后就固定用它。Richard Yen 用 pgbench 构造了 99.9% 取 Y、0.1% 取 N 的倾斜列:查 Y 时定制计划走顺序扫描,通用计划却按 50% 选择率估算而选了索引扫描,第六次之后永久切过去,于是同一条查询在数据没变的情况下突然变慢。数据分布越倾斜,这个坑越深。
commit 83ea6c540 之后生成表达式对每一行都要 stringToNode 重新解析,百万行需时约 1.5 分钟。
commit 020c02bd9 加的测试用了只在 cassert 构建里初始化的 nblocks,Melanie Plageman 已定位。
pg_stat_autovacuum_priority 需要 pg_read_all_stats 权限,函数每次都做一次完整的 pg_class 扫描。
Etsuro Fujita 发现开启 fetch_stats 时对外表分析 ctid 列会引发多余的远程访问。
Andrew Dunstan 在 3 月 20 日提交了 Joe Conway 与 Jian He 的补丁,COPY TO 从此能把查询结果或表数据导成一行一个 JSON 对象的流,写法是 COPY 表名 TO stdout WITH (format json),加 force_array 则包成一个数组。这条路只支持导出,且与 HEADER、NULL、DELIMITER 等文本选项互斥。相比过去用 to_json() 拼装,原生实现不会在嵌套引号上产出非法 JSON。
PostgreSQL 12 之前 CTE 是硬性的优化栅栏,之后规划器会按写法决定内联还是物化。Radim Marek 归纳:只被引用一次的纯 SELECT 会被内联,谓词得以合并,可读性不再有代价;被多次引用的昂贵聚合物化一次更划算。坏处出在物化上,结果落进临时元组存储,没有 pg_statistic 条目,规划器只能退回默认选择率,连接计划因此走偏甚至溢出内存。结果集很大又要多次引用时,带索引和统计的临时表更稳。
Peter Geoghegan 新建 heapam_indexscan.c,加入基于槽的索引扫描接口,并把 VM 查找下沉到 heapam。
审阅认为总体可用,但发现活跃槽被 SIGTERM 终止后,walreceiver 会陷入无限重试。
Álvaro Herrera 说 0001 状态良好但要等 0003 一起提交,并发代码收进 commands/repack_worker.c。
pg_duckpipe 是把 PostgreSQL 堆表经 WAL 持续同步到 DuckLake 列存表的扩展,让一套库同时承担事务与分析负载,不需要 Kafka、Debezium 或外部编排。三月这批更新最显眼的是透明查询路由:规划器钩子把分析型 SELECT 自动改写到列存副本,auto 模式下主键点查仍留在堆表。新增的 append 同步模式把每次变更写成不可变变更日志,带 SCD Type 2 语义,也支持没有主键的表。此外还有多库扇入与分区表同步。
Amit Kapila 合入 Gyan Sreejith 的补丁,新增 -l/--logdir 建带时间戳的目录分开存放服务端与内部日志。
FreeBSD 13.1 起 tar 默认按稀疏格式打包 WAL,文件名多出 GNUSparseFile.0/ 前缀,解析逻辑认不出来。
Greenmask 是无状态的逻辑备份与脱敏工具,不改 schema,可以直接替代 pg_dump 与 pg_restore,常用来把生产数据做成能进测试环境的脱敏副本。从 0.2.9 到 0.2.17 这一串版本补上了 PostgreSQL 18 支持,恢复端新增 -C 参数,validate 改走内存存储,list-dumps 增加 --quiet,并提供官方安装脚本;转换器新增邮编脱敏与多列公司数据生成。修复覆盖继承逻辑的栈溢出与 ACL 恢复等问题。
PostgreSQL 18 从 SQL:2023 引入了 NOT ENFORCED 约束,它和早就存在的 NOT VALID 完全不同。NOT VALID 允许先把约束加上而不立即校验存量数据,适合校验代价高昂的大表;NOT ENFORCED 则在数据库生命周期管理里承担另一种角色。EnterpriseDB 这篇文章把两者的定位讲清楚,指出它们针对的是同一类难题:数据量到了 TB 级之后,传统的约束强制执行本身就可能变成性能瓶颈。
基准跑出每秒 8 万次插入、延迟也漂亮,并不代表生产能长期扛住。Matty Stratton 认为真正该看的是持续吞吐上限,也就是 autovacuum、检查点、WAL 归档和复制这些维护进程能够无限期跟上的写入速率。这个上限会随数据增长而下降,文章归纳了四个推动机制,最先出现的是热数据超出可用内存和 autovacuum 跟不上回收。容量规划应当按这条持续上限来做,而不是按峰值数字。
Neon 的计算与存储分离,让它可以在维护之前后台先起一台新的 Postgres 计算节点,既不影响当前主节点也不计费。Hans Norheim 介绍的预热做法是把主节点缓存中的页面清单发给新节点,新节点从共享存储层把这些页读进缓存,再订阅 WAL 只接收与自身缓存有关的记录保持同步;随后旧主节点退出,新节点用 pg_promote 提升,省掉一次完整重启。10GB 的 pgbench 测试里预热后吞吐几乎立刻恢复,只读负载收益最明显。
一条 2 到 3 秒的查询,遇上 4000 个用户要求 60 秒内出结果,就变成 67 个并发执行,两核机器根本吃不下。Shaun Thomas 给出分层的替代方案:物化视图配 pg_cron 定时刷新,适合分钟级新鲜度的报表;pg_ivm 用触发器做增量维护,把秒级的全量刷新压到毫秒,代价是写入变重;再往外是 Redis 一类共享缓存,由后台进程按固定周期刷新;最外层用 CDN 或 Varnish 缓存 HTTP 响应。核心是让查询发生得更少。
Ninad Shah 梳理了这条弃用路线,建议管理员盘点仍在使用 md5 的实例并换到更强的认证方式。
讨论就此收尾,Nathan Bossart 确认变更进入代码库,David Rowley 对这项改造表示认可。
Andres Freund 在 valgrind 复核和最后一轮审阅之后提交,这项涉及提示位、校验和与异步写的工作耗时远超预期。
Daniel Gustafsson 完成变量改名与文档整理,Heikki Linnakangas 支持先提交 0001,测试开销仍是问题。
Heikki Linnakangas 的重构在动态成员上失败,Sami Imseih 建议统一改用 user-defined tranches 的说法。
AI 编程代理能写代码、能生成迁移文件,却做不了开库和发凭据这类运维动作,交付链条到部署这一步就断了。Neon 与 Stripe Projects 完成对接之后,代理可以通过程序化接口创建 Neon 的 PostgreSQL 实例并配好环境,中间不需要人介入。Brad Van Vugt 说这一步补上了代码生成与部署之间的空白,让 AI 辅助开发的流程可以完整跑通。
在数亿行、高并发的 PostgreSQL 上,Jake Hertz 实测 SELECT * 这类通配符查询会把性能拉低九成以上。开销来自三处:不必要的 I/O、缓冲区缓存被污染,以及多余列的序列化传输。执行时整页 8KB 会被读入内存,所有列都要过一遍 MVCC 可见性判断,再序列化送上网络;宽行让每页装下的记录更少,读放大随之加剧。结论很朴素:只取真正用到的列。
vignesh C 的补丁在 3 月 20 日由 Amit Kapila 提交,ALTER PUBLICATION 从此可以改动排除清单,写法是 ALTER PUBLICATION p1 SET ALL TABLES EXCEPT TABLE (s1.t1, s2.t2)。给出 EXCEPT 子句会整体替换原有的排除清单,不给则清空;SET 只写一类对象时,其余未提及的标志也会被重置。排除清单里只能放根分区表或普通表,写分区子表会报错。
Deepak Mahto 列出迁移工具不会提醒的四处麻烦。不带精度的 Oracle NUMBER 被 Ora2pg、AWS SCT 等工具直接映射成 NUMERIC 或 DOUBLE PRECISION,隐式转换会拖慢过程式代码与索引;Oracle 默默完成的类型转换到 PostgreSQL 会直接报运算符错误;SCT 会把无法转换的逻辑编译成空壳过程,元数据校验看不出来;aws_oracle_ext 这类专有 schema 带来云厂商锁定,应换成原生功能或 orafce。
Jeremy Schneider 梳理了 60 多个多人协作的开源项目如何管理数据库 schema 迁移,覆盖 PostgreSQL、MySQL 这类关系库,也包括 MongoDB、图数据库以及 Kubernetes、Dgraph 等系统。最常见的做法是直接用所在编程语言框架自带的迁移机制,其次是项目自己写的专用代码;触发迁移的方式以应用进程本身最普遍,其次是 Kubernetes Job。他说明结论借助 AI 工具整理并附了源码链接。
Robert Haas 的 v22 修掉 SubPlan 中 disabled_nodes 的错误,并补上处理替代子计划所需的基础设施。
cs_CZ 环境里字母排在数字之前,buildfarm 因此报错,Tom Lane 一度考虑把整个补丁回退。
补丁作者给出的基准是 TEXT 快 24%、CSV 快 35%,但含反斜杠或引号时会回退 4 到 6%。
VesselAPI 的海事 AIS 追踪平台每小时要吞下 70 万条船舶位置报告,MongoDB 在时序数据与空间查询上撑不住,团队把它迁到了 TimescaleDB。hypertable 按 1 小时自动切分 chunk,数据保留策略与压缩由此落地;空间一侧引入 H3 六边形索引,先给 PostGIS 查询做预过滤,候选行数从数百万降到数千。迁移过程中还顺带清理掉历史模型里积攒的 240 个废弃标签。
Rhys Stewart 记录了 Auchindown 把配电网设计逐层自动化的过程。第 0 层用 PostgreSQL 触发器和视图生成电杆、变压器、跨接等单个构件,把复杂表结构挡在工程师视线之外,并用 st_lineinterpolatepoint 按规范间距自动布杆。第 1 层是一个约 200 行的函数,从一个多边形出发生成整条支线,含电杆、线路、变压器与接户设施。第 2 层用既有电网数据训练模型,处理跨越数百个建筑轮廓的复杂布局。
Devrim Gündüz 说明这次连 extras 仓库在内的全部软件包都已就位,问题反馈走 pgdg-rpms 的 issue。
Andres Freund 已推送其中数个补丁,Melanie Plageman 指出注释写错和残留变量等问题。
参数误传成 fcinfo->args,溢出时会给出错误日期而不是 NULL,Peter Eisentraut 已提交单行修复。
Lukas Fittl 的新函数按 relfilenode 与 fork 聚合,比查完整视图快约 7 倍,便于回答某表缓存了多少。
Fujii Masao 在带槽同步的复杂配置中复现,即使超时设为 1 主库仍卡住,Vitaly Davydov 已找到根因。
大版本升级后统计信息清零、查询变慢甚至超时,是长期存在的性能悬崖。PostgreSQL 18 支持在升级中保留规划器统计,Nikolay Samokhvalov 验证它对更早的版本同样可用:用 PG18 自带的 pg_dump 加 --statistics-only,从 PG14 到 PG17 的旧集群取出统计,再用新的恢复函数导入新集群。测试确认 PG18 的 pg_dump 能顺利从 PG16 服务端提取。跨版本升级因此不必等 ANALYZE 跑完再放流量。
PostgreSQL 18 支持用 Google、Auth0 等身份提供方签发的令牌代替密码登录。Rafia Sabih 梳理了整条链路:服务端编译时要带 --with-libcurl,客户端需要 psql 18 或更高版本;pg_hba.conf 中的 oauth 方法要写明签发者 URL 与 scope,验证器和用户名映射按需配置。连接时既可以走基于浏览器的交互式认证提示,也可以直接携带已经拿到的令牌。这条路径把口令管理挪到了身份提供方一侧。
OCI 的虚拟 IP 是绑在实例 VNIC 上的第二私有 IP,不像 AWS 和 Azure 那样能在实例间漂移。Umair Shahid 指出,切换时数据库层面已经完成提升,VIP 却仍注册在原实例的 VNIC 上,流量继续送往停摆或只读的节点,集群状态看上去还一切正常。解法有两条:用 HAProxy 探测 Patroni 的接口,彻底不依赖 VIP;或在提升后的钩子里调 OCI CLI 重挂第二私有 IP,代价是多出 5 到 15 秒。
Vibhor Kumar 认为企业数据平台的深层变化不是 AI 改造数据库,而是系统之间的接缝被迫减少。事务、分析、流式和机器学习各立门户的架构长期被容忍,代价是重复副本、来回搬运和分散的访问路径。他把 PostgreSQL 放在事务系统的锚点位置,用逻辑复制与 CDC 控制数据流动,用 pgvector 做向量检索,用外部数据包装器查远端,用行级安全与 pgAudit 管治理。给技术负责人的建议是按运维负担而不是纯性能评估平台。
Jim Jones 发现 PostgreSQL 18 的 VACUUM FULL 和 CLUSTER 同样中招,补丁按命名空间判断并跳过其他会话的临时表。
Michael Paquier 拆出重构部分后应用了主补丁,按 pgstat_io.c 的模式记录各 locktag 的等待时间与次数。
Jeff Davis 改为给每个订阅单独的内存上下文,初始挂在事务上下文之下,再按需重挂父级。
标的是 Antimatter 与 SiftD.ai,这家公司在拿到 50 亿美元融资后仍在物色更多收购对象。