支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11

30.2. 何時使用JIT? #

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)

的查詢。考量到計畫的成本,完全有理由不使用JITJIT的成本會高於潛在的節省。調整成本限制將導致使用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_costjit_optimize_above_cost 也降低了,那結果就會改變。

提交更正

如果您在說明文件中發現任何不正確、與您特定功能的使用體驗不符或需要進一步澄清的地方,請使用此表單來報告說明文件問題。