我的数据库中有一个表,该表占用161GB的硬盘空间。 200Gb硬盘仅剩5 GB可用空间。
以下命令显示我的表正在消耗161GB硬盘空间,
select pg_size_pretty(pg_total_relation_size('Employee'));
表中有近527行。现在我删除了250行。我再次检查了Employee的pg_total_relation_size。大小仍为161GB。
看到上面查询的输出后,我运行了vacuum命令:
VACUUM VERBOSE ANALYZE Employee;
我使用来检查VACUUM是否确实发生了,
SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables;
我可以看到与运行VACUUM命令的时间相匹配的最后一个真空时间。
我还运行了以下命令,看是否有死元组,
SELECT relname, n_dead_tup FROM pg_stat_user_tables
;
Employee表的n_dead_tup计数为0。
如果我运行上述所有这些命令,
select pg_size_pretty(pg_total_relation_size('Employee'));
它仍然显示161GB。
我可以知道这背后的原因吗?另外,请更正我关于如何释放interface_list的信息。
答案 0 :(得分:4)
vacuum
实际上并不“释放”空间。它仅将不再使用的空间标记为可重复使用。因此,后续的UPDATE或INSERT语句可以使用该空间,而不是附加到表中。
VACUUM
的标准格式删除表和索引中的死行版本,并标记可用于将来重用的空间。但是,它不会将空间返回给操作系统,除非在特殊情况下,表末尾的一个或多个页面变得完全空闲并且可以很容易地获得独占表锁。 >
(重点是我的)
如果重新插入250条已删除的行,您将看到该表不会再次增长,因为新插入的行仅使用vacuum
标记为空闲的空间。
如果您实际上是想将表的大小实际减小到“需要”的大小,则需要运行vacuum full
。
VACUUM FULL
通过编写表文件的完整新版本没有死空间来主动压缩表。这样可以最大程度地减少表的大小,但是会花费很长时间。在操作完成之前,表的新副本还需要额外的磁盘空间
(重点是我的)