PG19 核心优化:解决两个常用插件互殴,查询监控终于清爽了
PostgreSQL 19 核心优化:告别扩展互殴,查询监控终于清爽了
摘要: PostgreSQL 19 对查询级监控机制进行了重大重构,完美解决了 pg_stat_statements 和 auto_explain 两大神器「不能共存」的历史难题。
痛过的人都懂:两大神器同场就翻车
用 PostgreSQL 的同学,手里基本都有两张王牌:
pg_stat_statements —— 查询性能统计,谁慢了一目了然 auto_explain —— 慢查询的执行计划自动记录
但这两个扩展示图同时追踪"查询总耗时"时,老版本会让你体验什么叫「神仙打架」:
扩展 A 说我要计时 → 扩展 B 说我要统计 buffer → 互相覆盖 → 只有一个生效
更离谱的是,为了防这种互殴,所有扩展都不得不开启全部监控选项,性能白白浪费。
PostgreSQL 19 的解法:声明式监控
19 版本引入了「声明式」设计,核心思路就一句:你告诉我你需要什么,我来统一分配。
旧架构 vs 新架构
|=) | ||
totaltime | query_instr |
扩展开发者的新范式
// 只需要声明需求
queryDesc->query_instr_options |= INSTRUMENT_TIMER;// 不再需要自己分配!
// 核心会在 ExecutorStart 时统一处理
三个字:别抢了。
实测效果
之前(PG 18 及之前):
pg_stat_statements: 我要 INSTRUMENT_ALL
auto_explain: 我要 INSTRUMENT_TIMER
结果:可能互相覆盖,性能开销大
之后(PG 19):
pg_stat_statements: query_instr_options |= INSTRUMENT_ALL
auto_explain: query_instr_options |= INSTRUMENT_TIMER
↓ 自动合并
ExecutorStart: InstrAlloc(INSTRUMENT_ALL | INSTRUMENT_TIMER)
↓ 两个扩展各取所需,和平共存
对 DBA 意味着什么?
更稳 —— 多扩展共存不再玄学 更快 —— 扩展可以精确请求需要的监控项,减少不必要的开销 更清晰 —— 行为可预测,排障有底气
架构思维升级
这次改动体现了一个重要趋势:从「你来分配我来调用」到「你来声明我来分配」。
这种模式在 Kubernetes 等现代系统设计中广泛应用,核心好处就是可组合——多个组件可以安全地共存,各取所需。
结语: PostgreSQL 19 这一处重构虽然不在 release note 的聚光灯下,但每一个同时用着 pg_stat_statements 和 auto_explain 的 DBA,都值得为这个改进鼓掌。
相关 commit:2c16deee2f7d52d6567dcbad046f74a8e880ee52