PostgreSQL utilizează un mecanism de concurență multiversiune (MVCC): atunci când execuți un `UPDATE` sau un `DELETE`, rândul vechi nu este șters fizic de pe disc, ci este doar marcat ca invizibil pentru tranzacțiile viitoare, devenind un ‘rând mort’ (Dead Tuple).
Fără o întreținere periodică, tabelele și indicii suferă de fenomenul de umflare (*table bloat*), ocupând de 3-5 ori mai mult spațiu și încetinind dramatic scanările. Comanda VACUUM parcurge tabelele și marchează spațiul ocupat de rândurile moarte ca fiind reutilizabil pentru noi inserări.
Combinat cu parametrul ANALYZE, utilitarul colectează eșantioane statistice despre distribuția datelor din coloane, permițând planificatorului de interogări (Cost-based Query Planner) să aleagă cele mai rapide planuri de căutare prin indecși.
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
VACUUM |
Recuperează spațiul ocupat de dead tuples făcându-l disponibil pentru noi inserări în cadrul tabelei. |
VACUUM FULL |
Rescrie fizic întreaga tabelă pe disc pentru a restitui spațiul sistemului de operare (blochează tabela la scriere!). |
ANALYZE |
Actualizează statisticile din catalogul intern `pg_statistic` folosite de optimizer. |
Autovacuum Daemon |
Procesul de fundal care rulează automat VACUUM pe baza pragurilor de modificări din tabele. |
Exemple practice și cod
Exemplul 1: Rularea unei curățări și actualizări statistice complete pe tabela de comenzi
Comanda recomandată după operațiuni mari de import sau ștergere masivă.
-- Curățare fără blocarea scrierilor concurente cu actualizare de statistici:
VACUUM (VERBOSE, ANALYZE) comenzi;
-- Ieșire detaliată în consola psql:
INFO: vacuuming "public.comenzi"
INFO: "comenzi": found 14502 removable, 85000 nonremovable row versions in 1240 pages
DETAIL: 0 dead row versions cannot be removed yet.
CPU: user: 0.08 s, system: 0.02 s, elapsed: 0.11 s.
INFO: analyzing "public.comenzi"
INFO: "comenzi": scanned 1240 of 1240 pages, containing 85000 live rows and 0 dead rows;
VACUUM
Rezultat & Impact
Spațiu eliberat și statistici perfect calibrate pentru căutări ultra-rapide.
Greșeli frecvente și bune practici
- Rularea comenzii `VACUUM FULL` pe tabele mari de producție în timpul orelor de vârf; aceasta obține o blocare exclusivă (`ACCESS EXCLUSIVE LOCK`), blocând toate cererile utilizatorilor până la finalizare.
- Dezactivarea procesului automat de `autovacuum` din motive eronate de performanță, ducând la colapsul bazei de date după câteva săptămâni de operare intensă.