PostgreSQL中如何删除pg_stat_statements单条查询统计数据
问题答复
1. 是否存在可丢弃单条自定义查询对应统计信息的函数?
版本不同支持情况有区别:
- PostgreSQL 14 及以上版本支持单条统计清理,
pg_stat_statements_reset()提供了带参数的重载版本,函数签名如下:
三个参数分别对应查询ID、用户OID、数据库OID,都可以直接在pg_stat_statements_reset( queryid bigint DEFAULT 0, userid oid DEFAULT 0, dbid oid DEFAULT 0 )pg_stat_statements视图中查询获取,传入对应值即可精准删除单条记录的统计信息。参数默认值为0,代表该维度不做过滤,比如只传queryid、其余两个参数保持默认0,就会删除所有库、所有用户下该queryid对应的统计记录。
操作示例:-- 先查询目标语句对应的三个标识值 SELECT queryid, userid, dbid FROM pg_stat_statements WHERE query LIKE '%目标查询的特征片段%'; -- 传入查询到的值清理单条统计 SELECT pg_stat_statements_reset(对应queryid值, 对应userid值, 对应dbid值); - PostgreSQL 13 及更早版本没有内置单条清理能力,仅支持无参版本的
pg_stat_statements_reset()清空全部统计信息,官方没有提供定向删除单条记录的方案。
2. 单条查询的统计记录是否支持自动移除?
支持自动移除,常见的自动触发场景有三类:
- 容量阈值淘汰:
pg_stat_statements.max参数控制扩展最多存储的统计条目数,默认值为5000。当存储的条目数达到这个上限时,扩展会按LRU(最近最少使用)规则,自动淘汰最久没有被执行过的查询统计条目,为新出现的查询腾出存储空间。 - 重启场景清理:
pg_stat_statements.save参数默认值为on,实例正常关闭时会把统计数据落盘持久化,重启后自动加载保留;如果将该参数设为off,实例不管是正常停机还是异常崩溃,重启后所有统计记录都会被清空。 - 关联对象删除清理:如果统计条目对应的数据库被删除、或者对应的执行用户被删除,关联的统计记录也会被自动清理,不会残留无效条目。
内容的提问来源于stack exchange,提问作者yuoggy
相关产品推荐
相关产品推荐

