L’extension pg_stat_statements est la première à activer en production : elle agrège les statistiques de chaque requête SQL exécutée, permettant d’identifier les bottlenecks.
Voir notre guide extensions PG.
Activer
# postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
# Restart Postgres puis :
CREATE EXTENSION pg_stat_statements;
Top requêtes les plus coûteuses
SELECT
substring(query, 1, 60) AS query,
calls,
ROUND(total_exec_time::numeric / 1000, 1) AS total_sec,
ROUND(mean_exec_time::numeric, 2) AS mean_ms,
ROUND((100 * total_exec_time / SUM(total_exec_time::numeric) OVER ())::numeric, 1) AS pct
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;
Requêtes les plus lentes en moyenne
SELECT
substring(query, 1, 80) AS query,
calls,
ROUND(mean_exec_time::numeric, 2) AS mean_ms,
ROUND(stddev_exec_time::numeric, 2) AS stddev_ms
FROM pg_stat_statements
WHERE calls > 100
ORDER BY mean_exec_time DESC
LIMIT 10;
Reset stats périodique
-- Reset hebdomadaire pour focus sur le récent
SELECT pg_stat_statements_reset();
EXPLAIN les requêtes lentes
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM orders WHERE customer_id = 42 AND status = 'paid'
ORDER BY created_at DESC LIMIT 20;
-- Lire le plan, identifier Seq Scan, Hash Join coûteux
-- Ajouter index si nécessaire
CREATE INDEX orders_customer_status_idx ON orders (customer_id, status, created_at DESC);
pgbadger
Pour des rapports HTML hebdomadaires depuis les logs Postgres : pgbadger. Installable sur le VPS, lancé en cron, génère un rapport HTML accessible.