2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11

30.2. 何時使用JIT? #

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_costjit_optimize_above_cost 也被降低,那將是不同的。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的實際體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。