支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: 开发版
不支持的版本: 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也被降低,情况将发生变化。

提交更正

如果您在文档中看到任何不正确、与您特定功能体验不符或需要进一步澄清的地方,请使用此表单来报告文档问题。