SELECT t.oid::regclass AS table_name,
s.table_len AS size,
dead_tuple_len + s.approx_free_space AS reclaimable
FROM pg_class AS t
CROSS JOIN LATERAL pgstattuple_approx(t.oid) AS s
WHERE t.relkind = 'r'
ORDER BY (s.dead_tuple_len::float8 + s.approx_free_space::float8)
/ (s.table_len::float8 + 1.0) DESC;
您需要
pgstattuple
扩展才能获得可用空间量。所以你可以跑
where
size
和reclaimable
are 以字节为单位。请注意,此查询有些昂贵。
这应该可以很好地估计可以回收的空间,但实际上它会稍微少一些,因为
每个 8kB 块中总是有一些空闲空间太小而无法容纳另一行
如果您有长时间运行的事务,一些死元组可能无法回收