In PostgreSQL, updating or deleting rows does not immediately free physical disk blocks; it merely stamps tuples with an xmax transaction identifier. If Autovacuum is under-tuned or disabled:
- 1Table & Index Bloat: Dead rows accumulate across 8KB pages, causing tables and indexes to artificially bloat by tens of gigabytes and severely degrading buffer cache hit ratios.
- 2Transaction ID (XID) Wraparound Catastrophe: Because PostgreSQL uses 32-bit transaction identifiers, approaching the 2-billion transaction limit triggers an emergency shutdown into read-only mode to prevent catastrophic silent data corruption. Autovacuum prevents this by continuously freezing historic transaction IDs.