JIT編譯主要對長時間運作、CPU 密集型的查詢有益。通常這些會是分析查詢。對於短查詢,執行JIT編譯所增加的額外開銷通常會高於它可以節省的時間。
為了確定是否應該使用JIT編譯,會使用查詢的總估計成本 (請參閱第 68 章和第 19.7.2 節)。查詢的估計成本將與 jit_above_cost 的設定進行比較。如果成本更高,則將執行JIT編譯。然後需要進一步做出兩個決定。首先,如果估計成本高於 jit_inline_above_cost 的設定,則將內聯查詢中使用的短函式和運算符。其次,如果估計成本高於 jit_optimize_above_cost 的設定,則將應用昂貴的優化來改善產生的程式碼。這些選項都會增加JIT編譯開銷,但可以大幅減少查詢執行時間。
這些基於成本的決策將在規劃時做出,而不是在執行時做出。這表示在使用預備語句並使用通用計畫時(請參閱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 loops=1) -> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4) (actual time=0.017..0.111 rows=356 loops=1) Planning Time: 0.116 ms Execution Time: 0.365 ms (4 rows)
的查詢。考量到計畫的成本,完全有理由不使用JIT;JIT的成本會高於潛在的節省。調整成本限制將導致使用JITJIT
=# 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 loops=1) -> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4) (actual time=0.019..0.052 rows=356 loops=1) 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 也降低了,那結果就會改變。
如果您在說明文件中發現任何不正確、與您特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表單來報告說明文件問題。