Mesurer l'impact de la compilation JIT sur le temps des requêtes
PostgreSQLPerformancesCommande
-- Share of JIT time in total execution time (PG15+)
SELECT queryid,
calls,
jit_functions,
round((jit_generation_time + jit_inlining_time + jit_optimization_time + jit_emission_time)::numeric, 1) AS jit_ms,
round(total_exec_time::numeric, 1) AS total_ms,
round((100 * (jit_generation_time + jit_inlining_time + jit_optimization_time + jit_emission_time)
/ NULLIF(total_exec_time, 0))::numeric, 1) AS jit_pct,
left(regexp_replace(query, '\s+', ' ', 'g'), 100) AS query
FROM pg_stat_statements
WHERE jit_functions > 0
ORDER BY jit_pct DESC NULLS LAST
LIMIT 20;
-- Compare on a single query: check the "JIT:" section at the end of the output and Execution Time
SET jit = on;
EXPLAIN (ANALYZE) SELECT city, sum(balance) FROM customer GROUP BY city;
SET jit = off;
EXPLAIN (ANALYZE) SELECT city, sum(balance) FROM customer GROUP BY city;
RESET jit;Ce que fait la commande
Affiche, par requête, la part du temps de compilation JIT (generation, inlining, optimization, emission) dans le temps d'exécution ; mesure l'effet net en exécutant la même requête avec JIT activé et désactivé.
Quand l'utiliser
Lorsque de courtes requêtes OLTP ou de reporting présentent des délais inexpliqués de quelques dizaines à quelques centaines de ms ; en particulier sur les tables très partitionnées où des estimations de coût gonflées déclenchent le JIT.
Attention
Le JIT n'intervient que lorsque le coût du plan dépasse jit_above_cost (100000 par défaut) ; avec des estimations de coût gonflées, la compilation peut durer plus longtemps que l'exécution pour des requêtes courtes. Plutôt que de le désactiver globalement, envisagez d'abord ALTER ROLE ... SET jit = off pour le rôle/la base concerné ou un relèvement de jit_above_cost. EXPLAIN (ANALYZE, COSTS OFF) n'affiche pas la section JIT. Si PostgreSQL a été compilé sans prise en charge de LLVM, le JIT n'est jamais utilisé ; vérifiez avec SELECT pg_jit_available();
Voir aussi
- Trouver les requêtes les plus coûteuses (pg_stat_statements : temps total et moyen)
- Trouver les requêtes à l'origine des E/S disque, fichiers temporaires et WAL (pg_stat_statements)
- Réinitialiser les statistiques pg_stat_statements (toutes ou une seule requête)
- Journaliser les plans d'exécution des requêtes lentes avec auto_explain
- Lire un plan en profondeur avec EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL)
- Détecter les régressions de plan par queryid (comparaison de snapshots pg_stat_statements)