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のon/offで実行して正味の効果を測定する。
使用する場面
短い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();で確認する。