Измерить влияние 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();
Связанные материалы
- Найти самые дорогие запросы (pg_stat_statements: общее и среднее время)
- Найти запросы, создающие дисковый I/O, временные файлы и WAL (pg_stat_statements)
- Сбросить статистику pg_stat_statements (полностью или для одного запроса)
- Журналировать планы выполнения медленных запросов через auto_explain
- Детально разобрать план через EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL)
- Выявить регрессии планов по queryid (сравнение снимков pg_stat_statements)