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 也降低了,那将改变。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或需要进一步说明,请使用 此表格 报告文档问题。