Postgres VACUUM
Postgres uses MVCC (Multi-Version Concurrency Control): UPDATE doesn't overwrite a row, it marks the old version dead and writes a new one; DELETE just marks a row dead. This lets concurrent readers see consistent snapshots without locking, but dead rows ("dead tuples") accumulate. VACUUM is the background process that reclaims that space and updates statistics. Three flavours: autovacuum — runs automatically when thresholds hit, fine for most tables; manual VACUUM — for hot tables you want to force; VACUUM FULL — rewrites the table from scratch, actually shrinks it on disk, but takes an exclusive lock (don't run on production). The pathology everyone eventually hits is "table bloat" — autovacuum falling behind on a write-heavy table, dead tuples piling up, queries getting slower. Fix by tuning autovacuum_vacuum_scale_factor on that specific table. Also: XID wraparound is the scariest failure mode, and avoiding it is ultimately why VACUUM exists at all.