Ce qui se passe
PostgreSQL tient déjà la comptabilité de sa propre santé, dans des vues comme
pg_stat_user_tables, pg_stat_activity et pg_stat_statements. Le problème
n'a jamais été la donnée : c'est que personne ne va la lire avant l'incident.
Vacuum, paquet Laravel de Rati Rukhadze, lit ces vues et liste les problèmes
trouvés avec la requête SQL qui les corrige. Treize règles de conseil
couvrent le wraparound des identifiants de transaction, le bloat, les tuples
morts, les index jamais utilisés et les requêtes lentes. Chaque constat porte
une sévérité, et l'ensemble donne une note sur 100. Un tableau de bord s'ouvre
sur /vacuum, en Blade ou en plugin Filament 4 ou 5.
La partie qui rentabilise : la CI
Le tableau de bord est l'accessoire ; les deux commandes sont l'essentiel.
php artisan vacuum:check # les mêmes règles, au terminal
php artisan vacuum:check --fail-on=warning # critical, warning, info ou never
php artisan vacuum:check --format=json # score, note, déductions, constats
php artisan vacuum:lint # schéma : clés étrangères non indexéesvacuum:lint attrape dans les migrations ce qui coûtera cher plus tard — une
clé étrangère sans index rend une suppression en cascade lente des mois après la
mise en production. Sur une tâche planifiée contre la préproduction,
vacuum:check fait échouer le build quand l'âge de gel d'une table franchit le
seuil critique.
Les seuils se règlent dans config/vacuum.php, notamment dead_tuple_ratio
(0.20) et slow_query_milliseconds (500).
Installer
composer require heyosseus/vacuum
php artisan vacuum:installVacuum 1.2.0 demande PostgreSQL 14 et Laravel 11+. L'extension
pg_stat_statements reste optionnelle : sans elle, le tableau de bord signale
son absence. Celui-ci ne s'ouvre qu'en environnement local ; ailleurs, il faut
déclarer un rappel :
use Heyosseus\Vacuum\Vacuum;
Vacuum::auth(fn (Request $request) => $request->user()?->isAdmin() === true);À retenir
L'intérêt n'est pas de voir sa base notée sur 100, c'est de déplacer le moment
où on apprend le problème : avant la fusion, dans la CI, plutôt que pendant
l'incident. Le paquet expose aussi un endpoint /learn qui explique chaque
classe de problème sur vos propres tables — utile pour transmettre le sujet dans
une équipe où Postgres est administré par défaut plutôt que par choix.