
pg_stat_statements 的 reset 操作不会影响已采集的历史数据存储,但会清空内存中正在累积的统计计数;历史数据是否保留,取决于你是否启用了 pg_stat_statements.save 参数并正确配置了持久化机制。
reset 的实际行为:只清内存,不删磁盘
执行 SELECT pg_stat_statements_reset(); 或 pg_stat_statements_reset(oid) 时:
- 仅重置共享内存中的当前统计值(如 calls、total_time、rows 等),相当于把计数器归零
- 不影响已写入系统视图(如
pg_stat_statements)的快照数据 —— 但注意:该视图本身是实时内存视图,并不持久保存历史 - 若未启用持久化(
pg_stat_statements.save = on),则数据库重启后所有统计都会丢失,reset 只是提前“手动清零”
历史数据真正保留的关键:pg\_stat\_statements.save
PostgreSQL 从 v14 起支持将统计快照定期落盘,依赖以下配置:
-
必须在 postgresql.conf 中设置
pg_stat_statements.save = on(默认为 off) - 需配合
pg_stat_statements.max(控制最大语句数)和pg_stat_statements.track(控制跟踪级别)合理调优 - 落盘文件位于
$PGDATA/global/pg_stat_statements.bin,数据库正常关闭时自动保存,启动时自动加载 - 注意:它保存的是“上次关闭时的快照”,不是连续时间序列;中间的 reset 不会影响该快照内容
想长期保留多时间点历史?得靠外部归档
pg_stat_statements 本身不提供时间维度的历史版本。如需分析趋势、对比不同周期的性能变化:
- 建议定时(如每小时/每天)执行
INSERT INTO my_stat_history SELECT now(), * FROM pg_stat_statements; - 为避免大表膨胀,可按时间分区,或只保留高频/慢 SQL 的采样记录
- 搭配
pg_stat_statements.track_utility = off(跳过 VACUUM/EXPLAIN 等非查询语句),减少噪音 - 注意权限:执行 COPY 或 INSERT 需要足够权限,且目标表结构需与
pg_stat_statements兼容(字段名、类型、顺序)
常见误区提醒
很多人误以为 reset 是“删除历史”,其实:
- 没开
save = on→ 所有统计本就不持久,reset 和重启效果几乎一样 - 开了
save = on→ reset 后仍能从 bin 文件恢复上次关闭时的状态,但新采集数据从零开始 -
pg_stat_statements视图查不到“昨天的数据”,除非你主动归档过 - reset 不释放 shared memory 空间,只是清数值;内存占用由
max参数决定,与是否 reset 无关










