Postgres清理不会释放空间

9

我的数据库中有一张表,它占用了161GB的硬盘空间。在200GB硬盘中只剩下5GB的可用空间。

  1. 以下命令显示我的表占用了161GB的硬盘空间:
    select pg_size_pretty(pg_total_relation_size('Employee'));

  2. 该表中有接近527行数据。现在我删除了250行数据。然后我再次检查Employee表的pg_total_relation_size。但是它的大小仍然是161GB。

  3. 看到上面查询的输出后,我运行了VACUUM命令:
    VACUUM VERBOSE ANALYZE Employee;

  4. 我检查了VACUUM是否真正发生使用以下命令:
    SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables; 我可以看到最后的VACUUM时间与我运行VACUUM命令的时间相匹配。

  5. 我还运行了以下命令来查看是否存在死元组:
    SELECT relname, n_dead_tup FROM pg_stat_user_tables; Employee表中的n_dead_tup计数为0。

  6. 尽管运行了以上所有命令,但是如果我运行以下命令:
    select pg_size_pretty(pg_total_relation_size('Employee')); 仍然显示161GB。

请问产生这种情况的原因是什么?同时请指出如何释放interface_list。

1个回答

20

Vacuum并不会物理上“释放”空间,它只是将不再使用的空间标记为可重用状态。因此,后续的UPDATE或INSERT语句可以使用该空间而不是附加到表中。

引用手册中的说明

标准形式的VACUUM删除表和索引中的死行版本,并标记未来重用的空间。但是,它不会将空间归还给操作系统,除非在表末尾的一个或多个页面变得完全空闲且可以轻松获得独占表锁的特殊情况下

(强调是我加的)

如果重新插入已删除的250行数据,则会发现表的大小不再增大,因为新插入的行只是使用vacuum标记为空闲状态的空间。

如果您真正想将表的物理大小减少到所需的大小,则需要运行 vacuum full

引用手册中的说明

VACUUM FULL 通过完全重写表文件去除死空间来主动压缩表。这最小化了表的大小,但可能需要很长时间。此外,在操作完成之前,它还需要额外的磁盘空间来存储新副本的表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接