PG 19 提供统计信息持久化增强接口
本期播客
PostgreSQL 19 preview - 提供统计信息持久化增强接口
https://github.com/postgres/postgres/commit/4ba012a8ed9c4214bd35b221c087f02efb1ac424
这个补丁(Commit 4ba012a8ed9c4214bd35b221c087f02efb1ac424)是对 PostgreSQL 累积统计信息(Cumulative Statistics) 系统的一个重要增强,允许它在数据库关闭和启动时,将额外的辅助数据(Auxiliary Data)读写到磁盘。
补丁解决的问题
PostgreSQL 的累积统计信息(例如查询计数、块访问量等)通常存储在共享内存(Shared Memory)中,并在数据库正常关闭时被写入磁盘文件 (pgstats),启动时再加载回来。
然而,一些高级统计信息(如 pg_stat_statements 扩展中使用的规范化查询字符串)是可变长度的,不适合直接存储在固定大小的共享内存统计条目中。它们通常需要存储在单独的内存区域(如动态共享内存段 DSA segment)或外部文件中。
此补丁提供了将共享内存统计条目与外部辅助数据关联起来的机制,确保这些辅助数据也能在服务器关闭时持久化到磁盘,并在启动时被正确加载。
补丁实施的更改(新机制)
该补丁通过在 PgStat_KindInfo 结构中添加三个新的可选回调函数,为可变编号的统计信息类型(Variable-numbered stats kinds)引入了新的序列化(Serialization)能力:
1. 序列化回调(读写辅助数据)
这两个回调函数负责处理每个统计条目(per-entry)的辅助数据:
to_serialized_data(写入辅助数据):在主统计数据被写入磁盘后调用。 用于将与该统计条目相关的辅助数据(如规范化查询文本)写入磁盘。 可以写入到现有的 pgstats文件,也可以写入到根据条目键名(entry keys)构建的新辅助文件中。from_serialized_data(读取辅助数据):在主统计数据从磁盘读取后调用。 用于从磁盘文件读取相应的辅助数据,并将其链接到内存中的统计条目。
2. 完成回调(资源清理)
这个回调函数在处理完某个类型(Kind)的所有统计条目后调用,用于清理资源:
finish:在统计文件完成 读取(STATS_READ) 、写入(STATS_WRITE) 或丢弃(STATS_DISCARD) 操作后调用。 允许扩展或模块执行收尾工作,例如关闭打开的文件句柄、清理临时资源。
通过这些更改,诸如 pg_stat_statements 这样的扩展就能更安全、更可靠地将长查询(long query)字符串等数据持久化到磁盘,并在服务器重启后恢复其完整的统计状态。
文件变动概要
** src/include/utils/pgstat_internal.h**:定义了新的回调函数指针(to_serialized_data、from_serialized_data、finish)以及一个用于表示统计文件操作状态的枚举类型PgStat_StatsFileOp。** src/backend/utils/activity/pgstat.c**:在统计数据的读写逻辑 (pgstat_write_statsfile和pgstat_read_statsfile) 中添加了对新序列化回调的调用。同时,在所有统计文件操作结束时(读、写、丢弃),新增了对finish回调的循环调用,以确保资源被正确清理。
最后附一则济南的线下峰会消息:
PostgreSQL & IvorySQL 2026 年度峰会将于4月份在济南召开,这是目前国内规模最大的PG峰会.
我是新特性分论坛出品人,欢迎报名参与分享,主委会可解决分享嘉宾住宿和路费。
报名地址: https://jsj.top/f/uebqBc
议题方向:
PostgreSQL 新功能 PostgreSQL 内核机制与性能优化 PostgreSQL 扩展程序 AI + PostgreSQL 技术实践 云原生PostgreSQL或IvorySQL PostgreSQL 用户实践 IvorySQL 兼容性与生态实践 基准测试与性能调优 高可用性技术 …… 任何与PostgreSQL或IvorySQL相关的内容