Auswirkung der JIT-Kompilierung auf die Abfragezeit messen
PostgreSQLPerformanceBefehl
-- 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();
Verwandte Einträge
- Teuerste Abfragen finden (pg_stat_statements: Gesamt- und mittlere Zeit)
- Abfragen finden, die Platten-I/O, Temp-Dateien und WAL verursachen (pg_stat_statements)
- Statistiken von pg_stat_statements zurücksetzen (alle oder eine einzelne Abfrage)
- Ausführungspläne langsamer Abfragen mit auto_explain protokollieren
- Plan im Detail lesen mit EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL)
- Planregressionen per queryid erkennen (Snapshot-Vergleich von pg_stat_statements)