DBAtlas · Атлас эксплуатации баз данных

Измерить влияние JIT-компиляции на время запроса

PostgreSQLПроизводительность

Команда

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

Что делает

Показывает для каждого запроса долю времени JIT-компиляции (generation, inlining, optimization, emission) во времени выполнения; измеряет итоговый эффект, выполняя один и тот же запрос с включённым и выключенным JIT.

Когда использовать

Когда короткие OLTP- или отчётные запросы показывают необъяснимые задержки в десятки–сотни ms; особенно на сильно секционированных таблицах, где завышенные оценки стоимости включают JIT.

Внимание

JIT включается, только когда стоимость плана превышает jit_above_cost (по умолчанию 100000); при завышенных оценках стоимости компиляция коротких запросов может длиться дольше их выполнения. Вместо глобального отключения сначала рассмотрите ALTER ROLE ... SET jit = off для затронутой роли/базы данных или увеличение jit_above_cost. EXPLAIN (ANALYZE, COSTS OFF) не выводит раздел JIT. Если PostgreSQL собран без поддержки LLVM, JIT никогда не используется; проверьте через SELECT pg_jit_available();

Открыть в DBAtlas →

Связанные материалы