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 或报表查询出现数十到数百毫秒的不明延迟时;尤其是在分区很多的表上,被夸大的成本估算会触发 JIT。

注意

只有当计划成本超过 jit_above_cost(默认 100000)时 JIT 才会启动;在成本估算被夸大时,短查询的编译时间可能比执行时间还长。与其全局禁用,不如先考虑为受影响的角色/数据库执行 ALTER ROLE ... SET jit = off,或调高 jit_above_cost。EXPLAIN (ANALYZE, COSTS OFF) 不会输出 JIT 部分。如果 PostgreSQL 编译时没有 LLVM 支持,则永远不会使用 JIT;用 SELECT pg_jit_available(); 检查。

在 DBAtlas 中打开 →

相关内容