VACUUM & ANALYZE în PostgreSQL în PostgreSQL

Eliberarea spațiului pe disc ocupat de rândurile șterse (Dead Tuples), prevenirea fenomenului de Transaction ID Wraparound și actualizarea statisticilor.

Sintaxă SQL
VACUUM (VERBOSE, ANALYZE) [tabel];

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ă.

Ghiduri și noțiuni înrudite