PostgreSQL码农集散地

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相关的内容