如何预测 VACUUM FULL 会回收多少空间?

Ora*_*Dog 5 postgresql vacuum postgresql-12

有没有办法提前确定VACUUM FULL特定表上的多少磁盘空间将返回给操作系统?因此,您可以决定这样做是否值得付出代价。

如果有一个简单的查询来为数据库/服务器中的每个表执行此操作(而不是单独执行每个表),则奖励。

Lau*_*lbe 6

您需要pgstattuple扩展来获取可用空间量。

所以你可以跑

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;
Run Code Online (Sandbox Code Playgroud)

其中sizereclaimable以字节为单位。

请注意,此查询有点昂贵。

这应该可以很好地估计可以回收的空间,但实际上它会稍微少一些,因为

  1. 每个 8kB 块中总是有一些空闲空间太小而无法容纳另一行

  2. 如果您有长时间运行的事务,一些死元组可能无法回收