支援版本: 目前 (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)

的查詢。 鑑於計畫的成本,沒有使用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 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 也降低了,情況就會改變。

提交更正

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