PostgreSQL 12如何预估VACUUM可回收磁盘空间及需清理的表?
预估可回收空间大小的方法
PostgreSQL 12可以通过两种方式快速获取VACUUM FULL可回收空间的粗略值:
- 高精度估算(需要全表扫描,适合单表查询)
首先启用pgstattuple内置扩展:
CREATE EXTENSION IF NOT EXISTS pgstattuple;
查询指定表的可回收空间:
SELECT (dead_tuple_len / 1024 / 1024)::numeric(10,2) AS estimated_reclaimable_mb FROM pgstattuple('your_table_name');
返回结果中的estimated_reclaimable_mb就是该表执行VACUUM FULL后大致能释放给操作系统的空间大小,单位为MB。
2. 低精度快速估算(基于统计信息,无需扫描表,适合全库批量查询)
直接查询系统统计视图即可秒出结果,精度足够做优先级判断:
SELECT schemaname || '.' || relname AS table_name, (n_dead_tup * (current_setting('block_size')::integer / 1000)) / 1024::numeric(10,2) AS estimated_reclaimable_mb, (pg_relation_size(relid) / 1024 / 1024)::numeric(10,2) AS total_table_mb FROM pg_stat_user_tables WHERE n_dead_tup > 10000 ORDER BY estimated_reclaimable_mb DESC;
判断需要执行VACUUM操作的表
可以通过以下几个维度筛选需要优先处理的表:
- 死元组占表总容量的比例超过20%,且后续没有大量写入操作复用空闲空间的表
- 长时间没有触发autovacuum(查看
pg_stat_user_tables.last_autovacuum字段为空或时间很久远),同时死元组数量持续增长的表 - 频繁执行DELETE/全量UPDATE操作,且没有配置自动VACUUM阈值的大表
额外说明:默认的autovacuum触发的是普通VACUUM,只会将死元组占用的空间标记为可复用,不会返还给操作系统,所以你观察不到磁盘占用下降,只有VACUUM FULL才会将空闲空间释放给OS。如果你的表后续会有持续写入,不需要频繁执行VACUUM FULL,普通VACUUM回收的空闲空间会被新写入的数据复用,也能避免磁盘持续膨胀。
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

