Het doel van vacuüm en autovacuum uitleggen
Wanneer een rij wordt bijgewerkt, bestaat elke update uit een invoeg- en verwijderbewerking. De gewijzigde gegevens worden ingevoegd en de oude rij wordt verwijderd. In PostgreSQL blijft de oorspronkelijke rij behouden, zodat een transactie kan worden teruggedraaid als er een probleem is. In plaats van de oorspronkelijke rij te verwijderen, wordt deze later gemarkeerd voor verwijdering, wat resulteert in 'dode' rijen (of tuples) die zich nog op schijf bevinden, maar die niet meer nodig zijn.
Met het terecht genoemde vacuumproces worden deze rijen permanent verwijderd, waardoor er ruimte wordt teruggewonnen die anders verloren zou gaan, en worden statistieken bijgewerkt.
Het proces van het opschonen van de dode rijen wordt het vacuümproces genoemd. Als deze rijen op schijf achterblijven, neemt de database meer schijfruimte in beslag die nodig is, ook wel database -bloat genoemd. Het proces VACUUM is om de volgende redenen belangrijk:
- Schijfruimte herstellen die wordt bezet door rijen die zijn gemarkeerd voor verwijdering.
- Gegevensstatistieken bijwerken voor gebruik door de queryplanner.
- Als u de zichtbaarheidskaart wilt bijwerken, waardoor indexscansworden versneld.
- Ter bescherming tegen het verlies van oude gegevens als gevolg van de transactie-ID-overloop.
PostgreSQL maakt gebruik van een proces dat vacuüm wordt genoemd om rijen permanent te verwijderen en de ruimte vrij te maken. Naast het vrijmaken van ruimte zorgt het er ook voor dat indexen effectief zijn.
Wanneer het vacuümproces automatisch wordt geactiveerd, wordt het proces autovacuumgenoemd. De frequentie waarmee het proces moet worden uitgevoerd, is afhankelijk van de hoeveelheid update- en verwijderbewerkingen. U kunt ook het aantal rijen controleren dat is gemarkeerd voor verwijdering.
Door het vacuümproces periodiek uit te voeren, zorgt u ervoor dat u het volgende niet doet:
- Ervaar "bloat", met inbegrip van databases en tabellen die groter zijn dan nodig.
- Grote, suboptimale indexen hebben.
- Ervaring met verbeterde I/O.
Als u het aantal 'dode' rijen in een tabel wilt bewaken, kunt u een SELECT-query uitvoeren:
SELECT relname, n_dead_tup, n_live_tup
FROM pg_catalog.pg_stat_all_tables
ORDER BY n_dead_tup DESC;
Als u het vacuümproces handmatig wilt uitvoeren, typt u:
vacuum