Postgres Vacuum无法释放空间

vin*_* hy 4 postgresql vacuum

我的数据库中有一个表,该表占用161GB硬盘空间。200Gb硬盘仅剩5 GB可用空间。

  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命令的时间相匹配的最后真空时间。

  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的问题。

a_h*_*ame 6

vacuum并不实际“释放”空间。它仅将不再使用的空间标记为可重复使用。因此,后续的UPDATE或INSERT语句可以使用该空间,而不是附加到表中。

引用手册

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

(强调我的)

如果您重新插入250条已删除的行,您将看到该表不再增长,因为新插入的行仅使用标记为可用的空间vacuum

如果您实际上想物理上将表的大小减小到“需要”的大小,则需要运行vacuum full

引用手册

VACUUM FULL通过编写没有死角的表文件的全新版本来主动压缩表。这样可以最大程度地减少表的大小,但是会花费很长时间。该表的新副本还需要额外的磁盘空间,直到操作完成

(强调我的)