DBAtlas · Atlas d'exploitation des bases de données

Mesurer l'impact de la compilation JIT sur le temps des requêtes

PostgreSQLPerformances

Commande

-- 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();

Ouvrir dans DBAtlas →

Voir aussi