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

提交更正

如果您在文档中发现任何不正确、与您对特定功能的实际体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。