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_factorpar 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
UPDATEmassifs peut doubler de taille avant que l'autovacuum ne s'en occupe. Prévoyezfillfactor(laisser de la place dans les pages) pour favoriser les mises à jour « HOT » quand les colonnes modifiées ne sont pas indexées.