DBAtlas · Atlas de operações de banco de dados

Medir o impacto da compilação JIT no tempo de consulta

PostgreSQLDesempenho

Comando

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

O que faz

Mostra, por consulta, a participação do tempo de compilação JIT (generation, inlining, optimization, emission) no tempo de execução; mede o efeito líquido executando a mesma consulta com JIT ligado e desligado.

Quando usar

Quando consultas OLTP curtas ou de relatório mostram atrasos inexplicáveis de dezenas a centenas de ms; especialmente em tabelas muito particionadas, em que estimativas de custo infladas disparam o JIT.

Atenção

O JIT só entra em ação quando o custo do plano excede jit_above_cost (padrão 100000); com estimativas de custo infladas, a compilação pode demorar mais que a execução em consultas curtas. Em vez de desabilitá-lo globalmente, considere primeiro ALTER ROLE ... SET jit = off para a role/banco afetado ou aumentar o jit_above_cost. EXPLAIN (ANALYZE, COSTS OFF) não imprime a seção de JIT. Se o PostgreSQL foi compilado sem suporte a LLVM, o JIT nunca é usado; verifique com SELECT pg_jit_available();

Abrir no DBAtlas →

Relacionados