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_cost 或 jit_optimize_above_cost 也降低了,情況就會改變。
如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。