PostgreSQL gebruikt MVCC: oude rijversies blijven staan tot VACUUM ze opruimt. Zonder goede VACUUM-discipline groeit de tabel onnodig (bloat) en uiteindelijk komt transaction ID wraparound, wat de database read-only maakt. Een freelance PostgreSQL DBA voorkomt dat.
Autovacuum-instellingen die werken
Default autovacuum_vacuum_scale_factor is 0.2: VACUUM start als 20 procent gewijzigd is. Voor grote tabellen is dat te laat. Per-tabel instellen via ALTER TABLE ... SET (autovacuum_vacuum_scale_factor = 0.05) brengt het naar 5 procent. autovacuum_workers van 3 naar 6 op systemen met veel tabellen.
Bloat meten en opruimen
pg_stat_user_tables toont n_dead_tup. Of het pgstattuple-extension voor exacte bloat-percentage. Bloat boven 30 procent op een productietabel is een tuning-signaal. VACUUM FULL ruimt op maar lockt de tabel; pg_repack doet hetzelfde online en is voor productie de juiste keuze.
Transaction wraparound voorkomen
PostgreSQL transaction IDs zijn 32-bit. Boven 2 miljard transacties moeten oude rijen "frozen" worden. Voor een database met 10K transacties per seconde is dat na een paar weken al kritisch. autovacuum_freeze_max_age (default 200M) en VACUUM FREEZE op rustige momenten gepland.
VACUUM versus VACUUM ANALYZE
VACUUM ruimt dead tuples op. VACUUM ANALYZE doet dat plus statistics-update. ANALYZE is voor de optimizer kritisch; verouderde statistics geven slechte plans. Wij zetten ANALYZE-frequentie strakker dan VACUUM-frequentie op tabellen waar veel inserts of updates langskomen.
VACUUM-impact op load
VACUUM verbruikt I/O. autovacuum_vacuum_cost_delay van default 2ms naar 0ms versnelt VACUUM op moderne SSD's, met meer I/O-druk. Per workload-tijd anders: 's nachts agressief, overdag voorzichtig. Sinds PostgreSQL 12 is parallel VACUUM beschikbaar voor grote tabellen.
Verwant: Freelance SQL DBA inhuren, PostgreSQL performance tuning.