JIT編譯主要有利於執行時間長的 CPU 密集型查詢。通常這些是分析型查詢。對於短查詢,執行JIT編譯的額外開銷通常會高於其能節省的時間。
要確定是否應使用JIT編譯,將使用查詢的總估算成本(請參閱 第 69 章 和 19.7.2 節)。查詢的估算成本將與 jit_above_cost 的設定進行比較。如果成本更高,則會執行JIT編譯。然後還需要做兩個進一步的決定。首先,如果估算成本高於 jit_inline_above_cost 的設定,則查詢中使用的短函式和運算子將被內聯。其次,如果估算成本高於 jit_optimize_above_cost 的設定,則將應用昂貴的最佳化來改進生成的程式碼。這些選項中的每一個都會增加JIT編譯開銷,但可以顯著減少查詢執行時間。
這些基於成本的決定將在計劃時間做出,而不是執行時間。這意味著在使用預準備語句(prepared statements)並使用通用計劃(generic plan)時(請參閱 PREPARE),生效的配置引數值在準備時控制決策,而不是執行時的設定。
如果 jit 設定為 off
,或者如果沒有可用的JIT實現(例如,因為伺服器沒有使用 --with-llvm
編譯),JIT將不會執行,即使根據上述標準它是有益的。將 jit 設定為 off
會在計劃和執行時間產生影響。
EXPLAIN 可用於檢視是否使用了JIT。例如,以下是一個沒有使用JIT:
=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class; QUERY PLAN ------------------------------------------------------------------------------------------------------------- Aggregate (cost=16.27..16.29 rows=1 width=8) (actual time=0.303..0.303 rows=1.00 loops=1) Buffers: shared hit=14 -> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4) (actual time=0.017..0.111 rows=356.00 loops=1) Buffers: shared hit=14 Planning Time: 0.116 ms Execution Time: 0.365 ms
的查詢。鑑於計劃的成本,沒有使用JIT是完全合理的;JIT的成本本會比潛在的節省要大。調整成本限制將導致JIT使用
=# SET jit_above_cost = 10; SET =# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class; QUERY PLAN ------------------------------------------------------------------------------------------------------------- Aggregate (cost=16.27..16.29 rows=1 width=8) (actual time=6.049..6.049 rows=1.00 loops=1) Buffers: shared hit=14 -> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4) (actual time=0.019..0.052 rows=356.00 loops=1) Buffers: shared hit=14 Planning Time: 0.133 ms JIT: Functions: 3 Options: Inlining false, Optimization false, Expressions true, Deforming true Timing: Generation 1.259 ms (Deform 0.000 ms), Inlining 0.000 ms, Optimization 0.797 ms, Emission 5.048 ms, Total 7.104 ms Execution Time: 7.416 ms
。從這裡可以看到,使用了JIT,但內聯和昂貴的最佳化沒有使用。如果 jit_inline_above_cost 或 jit_optimize_above_cost 也被降低,那將是不同的。
如果您在文件中發現任何不正確、與您對特定功能的實際體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。