You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 12如何预估VACUUM可回收磁盘空间及需清理的表?

预估可回收空间大小的方法

PostgreSQL 12可以通过两种方式快速获取VACUUM FULL可回收空间的粗略值:

  1. 高精度估算(需要全表扫描,适合单表查询)
    首先启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:12:03