Tous les termes du glossaire

VACUUM et autovacuum

À quoi sert VACUUM dans PostgreSQL ?

VACUUM récupère l’espace occupé par les versions de lignes mortes que laissent les mises à jour et les suppressions, met à jour la carte de visibilité et empêche le rebouclage des identifiants de transaction (wraparound). Autovacuum l’exécute à votre place.

En raison du MVCC, un UPDATE ou un DELETE dans PostgreSQL n’entraîne pas la suppression immédiate de l’ancienne version de la ligne ; celle-ci devient un tuple mort dès qu’aucune transaction ne peut plus la voir. VACUUM repère les tuples morts et marque leur espace comme réutilisable pour de nouvelles lignes de la même table.

Un VACUUM simple s’exécute en parallèle des lectures et écritures normales et ne réduit généralement pas la taille des fichiers de la table sur le disque. VACUUM FULL réécrit la table pour rendre l’espace au système d’exploitation, mais il pose un verrou exclusif pendant toute sa durée. VACUUM met aussi à jour la carte de visibilité, qui aide les parcours d’index seul (index-only scans), et gèle les anciennes lignes pour empêcher le rebouclage des identifiants de transaction. Le démon autovacuum exécute VACUUM et ANALYZE automatiquement ; les exécutions manuelles sont donc surtout utiles après de grosses modifications par lots.

Exemple

L’exemple met à jour chaque ligne d’une table, ce qui laisse 10 000 versions de lignes mortes, et exécute VACUUM (VERBOSE) pour indiquer ce qu’il a nettoyé. La requête de statistiques qui suit montre quand la table a été passée manuellement au VACUUM pour la dernière fois.

CREATE TABLE items (id int PRIMARY KEY, qty int);
INSERT INTO items SELECT g, 0 FROM generate_series(1, 10000) AS g;
UPDATE items SET qty = qty + 1;

VACUUM (VERBOSE) items;

SELECT relname, last_vacuum, n_dead_tup
FROM pg_stat_user_tables
WHERE relname = 'items';

Du SQL simple pour PostgreSQL 16 ou 17 standard, sans aucune extension. Exécutez-le dans une base de données vide que vous pouvez jeter ensuite.

Références

Documentation officielle de PostgreSQL (en anglais).

Termes associés