DBAtlas · Atlas für Datenbankbetrieb

Auswirkung der JIT-Kompilierung auf die Abfragezeit messen

PostgreSQLPerformance

Befehl

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

Was es tut

Zeigt je Abfrage den Anteil der JIT-Kompilierungszeit (Generation, Inlining, Optimization, Emission) an der Ausführungszeit; misst den Nettoeffekt, indem dieselbe Abfrage mit JIT an und aus ausgeführt wird.

Wann einsetzen

Wenn kurze OLTP- oder Reporting-Abfragen unerklärliche Verzögerungen von zehn bis hunderten ms zeigen; besonders bei stark partitionierten Tabellen, bei denen überhöhte Kostenschätzungen JIT auslösen.

Vorsicht

JIT greift nur, wenn die Plankosten jit_above_cost übersteigen (Standard 100000); bei überhöhten Kostenschätzungen kann die Kompilierung bei kurzen Abfragen länger dauern als die Ausführung. Statt es global abzuschalten, erwäge zuerst ALTER ROLE ... SET jit = off für die betroffene Rolle/Datenbank oder ein Anheben von jit_above_cost. EXPLAIN (ANALYZE, COSTS OFF) gibt den JIT-Abschnitt nicht aus. Wurde PostgreSQL ohne LLVM-Unterstützung gebaut, wird JIT nie verwendet; prüfe mit SELECT pg_jit_available();

In DBAtlas öffnen →

Verwandte Einträge