</>
Plan du cours — 47/64

VACUUM, bloat et autovacuum

Avancé

Puisque MVCC crée des versions de lignes, quelqu'un doit nettoyer les anciennes : c'est VACUUM. Sans lui, tables et index gonflent.

VACUUM (VERBOSE, ANALYZE) commandes;    -- ne bloque pas les lectures/écritures
VACUUM FULL commandes;                  -- réécrit la table : verrou EXCLUSIF, à éviter en production

Repérer le gonflement#

SELECT relname, n_live_tup, n_dead_tup,
       round(100.0 * n_dead_tup / nullif(n_live_tup + n_dead_tup, 0), 1) AS pct_mortes,
       last_autovacuum
FROM   pg_stat_user_tables
ORDER  BY n_dead_tup DESC
LIMIT  10;

Pourquoi l'autovacuum n'y arrive pas parfois#

  • Une transaction longue (ou un slot de réplication oublié) retient les anciennes versions : rien à nettoyer.
  • Les seuils par défaut sont trop hauts pour de grosses tables : abaissez autovacuum_vacuum_scale_factor par table.
  • Trop peu de « vitesse » allouée : autovacuum_vacuum_cost_limit, autovacuum_max_workers.

Réduire l'espace réellement rendu à l'OS#

VACUUM normal libère l'espace pour réutilisation par la table, mais ne la rétrécit pas. Pour reconstruire sans blocage long, utilisez pg_repack ou REINDEX INDEX CONCURRENTLY pour les index.

Piège : une table de plusieurs Go qui reçoit des UPDATE massifs peut doubler de taille avant que l'autovacuum ne s'en occupe. Prévoyez fillfactor (laisser de la place dans les pages) pour favoriser les mises à jour « HOT » quand les colonnes modifiées ne sont pas indexées.