PostgreSQL 17: 使用 pg_stat_reset_shared 重置所有全局统计信息

John Doe 五月 29, 2025

你需要跟踪数据库后台进程的压力变化吗?那么,你可能会要定期重置所有后台进程的统计信息。

在山坡漫步的大象

特性提交日志

pg_stat_reset_shared()中添加重置所有全局统计信息的功能。

当前,pg_stat_reset_shared()可以使用参数指定要重置的目标统计信息,由于该函数是严格模式(strict),当参数为NULL时不执行任何操作。

本次提交对pg_stat_reset_shared()进行了改进:将proisstrict切换为false,当参数值为NULL或未指定参数时,不再不执行任何操作,而是允许重置该函数已处理的所有类型的统计信息。与之前一样,SLRU 统计不包含在重置范围内。

是否要重置该函数已涵盖的所有全局统计信息,由使用NULL或无参数来进行控制。

讨论:https://postgr.es/m/4291a55137ddda77cf7cc5f46e846daf@oss.nttdata.com

示例

PostgreSQL 提供了几个系统视图,用于显示集群范围的统计信息。其中之一就是我们之前讨论过的新视图 pg_stats_checkpointer 。可以使用 pg_stat_reset_shared() 重置其中一些统计信息。除了 pg_stat_checkpointer 视图之外,还可以重置 pg_stat_bgwriterpg_stat_iopg_stat_walpg_stat_recovery_prefetchpg_stat_archiver 中的统计信息。

在之前的 PostgreSQL 版本中,如果要重置所有视图中的统计信息,则必须针对所有类型的统计信息单独调用此函数,例如:

postgres=# select * from pg_stat_reset_shared('bgwriter');
 pg_stat_reset_shared 
----------------------
  
(1 row)
 
postgres=# select pg_stat_reset_shared('bgwriter');
 pg_stat_reset_shared 
----------------------
  
(1 row)
 
postgres=# select pg_stat_reset_shared('archiver');
 pg_stat_reset_shared 
----------------------
  
(1 row)
 
postgres=# select pg_stat_reset_shared('wal');
 pg_stat_reset_shared 
----------------------
  
(1 row)
 
postgres=# select pg_stat_reset_shared('io');
 pg_stat_reset_shared 
----------------------
  
(1 row)
 
postgres=# select pg_stat_reset_shared('recovery_prefetch');
 pg_stat_reset_shared 
----------------------
  
(1 row)

在新的 PostgreSQL 版本中,这种情况将会改变,调用不带参数的函数将立即重置所有这些统计信息:

postgres=# select pg_stat_reset_shared();
 pg_stat_reset_shared 
----------------------
  
(1 row)

postgres=# select stats_reset, now() from pg_stat_archiver ;
          stats_reset          |              now              
-------------------------------+-------------------------------
 2025-04-12 10:29:19.341854+08 | 2025-04-12 10:30:42.304791+08
(1 row)

非常不错的体验,感谢所有参与的社区人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/23c8c0c8f4721db693ef908c22f7cf754e6852a9