我的数据库中有一个表,该表占用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的问题。
vacuum并不实际“释放”空间。它仅将不再使用的空间标记为可重复使用。因此,后续的UPDATE或INSERT语句可以使用该空间,而不是附加到表中。
标准形式的
VACUUM删除表和索引中的死行版本,并标记可用于将来重用的空间。但是,它不会将空间返回给操作系统,除非在特殊情况下,表末尾的一个或多个页面变得完全空闲,并且可以轻松获得独占表锁。
(强调我的)
如果您重新插入250条已删除的行,您将看到该表不再增长,因为新插入的行仅使用标记为可用的空间vacuum。
如果您实际上想物理上将表的大小减小到“需要”的大小,则需要运行vacuum full。
VACUUM FULL通过编写没有死角的表文件的全新版本来主动压缩表。这样可以最大程度地减少表的大小,但是会花费很长时间。该表的新副本还需要额外的磁盘空间,直到操作完成
(强调我的)
| 归档时间: |
|
| 查看次数: |
1989 次 |
| 最近记录: |