支持的版本: 当前 (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)

的查询。 鉴于计划的成本,完全有理由不使用JITJIT的成本将大于潜在的节省。 调整成本限制将导致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,情况将会改变。

提交更正

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