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の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();で確認する。

DBAtlas で開く →

関連項目