On this page
32.2. 何时准时?
JIT 编译主要有益于长时间运行的 CPU 绑定查询。通常,这些将是分析性查询。对于简短查询,执行 JIT 编译的额外开销通常会高于其节省的时间。
为了确定是否应使用 JIT 编译,将使用查询的总估计成本(请参见Chapter 70和Section 19.7.2)。查询的估计成本将与jit_above_cost的设置进行比较。如果成本较高,将执行 JIT 编译。然后需要两个进一步的决定。首先,如果估计成本大于jit_inline_above_cost的设置,则将内联查询中使用的短函数和运算符。其次,如果估计成本大于jit_optimize_above_cost的设置,则将应用昂贵的优化来改进生成的代码。这些选项中的每一个都增加了 JIT 编译的开销,但是可以大大减少查询的执行时间。
这些基于成本的决策将在计划时间而不是执行时间做出。这意味着,当使用准备好的语句并使用通用计划(请参见PREPARE)时,在准备时有效的配置参数的值将控制决策,而不是执行时的设置。
Note
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, 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也降低了,那将会改变。