VACUUM 跑完之后,空间为什么没回来
DELETE 之后表文件大小不变,这是预期行为。VACUUM 只是把空间标记为可复用,并不会把文件还给操作系统。要让文件真正变小,得用 VACUUM FULL 或者 pg_repack。
VACUUM FULL 会持有排他锁,期间表不可读写。对大表来说这不是能随便做的事,所以通常用 pg_repack:它建一份新表、慢慢同步、最后短暂切换,锁时间从小时级降到秒级。
另一个常见误解是 autovacuum 会处理一切。但 autovacuum 的触发阈值是按表大小比例的,大表需要更多死元组才触发,而这段时间里膨胀可能已经很明显了。给关键表单独设阈值比调全局参数更有效。
监控上应该看的是 n_dead_tup 和表的实际膨胀率,而不是「上次 VACUUM 什么时候」。前者反映问题,后者只反映动作。