DBAtlas · Atlas de operaciones de bases de datos

Medir el impacto de la compilación JIT en el tiempo de consulta

PostgreSQLRendimiento

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;

Qué hace

Muestra, por consulta, la proporción del tiempo de compilación JIT (generation, inlining, optimization, emission) en el tiempo de ejecución; mide el efecto neto ejecutando la misma consulta con JIT activado y desactivado.

Cuándo usarlo

Cuando consultas OLTP o de informes cortas muestran retrasos inexplicables de decenas a cientos de ms; sobre todo en tablas muy particionadas donde estimaciones de costo infladas disparan JIT.

Precaución

JIT solo se activa cuando el costo del plan supera jit_above_cost (100000 por defecto); con estimaciones de costo infladas, la compilación puede tardar más que la ejecución en consultas cortas. En lugar de deshabilitarlo globalmente, considere primero ALTER ROLE ... SET jit = off para el rol/base de datos afectado o subir jit_above_cost. EXPLAIN (ANALYZE, COSTS OFF) no muestra la sección JIT. Si PostgreSQL se compiló sin soporte de LLVM, JIT nunca se usa; compruébelo con SELECT pg_jit_available();

Abrir en DBAtlas →

Relacionado