32.1. 什么是 JIT 编译?

即时(JIT)编译是将某种形式的解释程序评估转换为本机程序,然后在运行时进行的过程。例如,代替使用可以评估任意 SQL 表达式的通用代码来评估诸如WHERE a.col = 3之类的特定 SQL 谓词,可以生成特定于该表达式并且可以由 CPU 本机执行的函数,从而产生加速。

当 PostgreSQL 用--with-llvm构建时,PostgreSQL 内置支持使用LLVM执行 JIT 编译。

有关更多详细信息,请参见src/backend/jit/README

32 .1.1. JIT 加速运营

当前,PostgreSQL 的 JIT 实现支持加速表达式评估和 Tuples 变形。将来可以加快其他几个操作。

表达式评估用于评估WHERE子句,目标列表,聚合和投影。可以通过生成针对每种情况的代码来加速它。

Tuples 变形是将磁盘上的 Tuples(请参见Section 68.6.1)转换为其内存中表示的过程。通过创建特定于表布局和要提取的列数的函数可以加快此过程。

32.1.2. Inlining

PostgreSQL 是非常可扩展的,并允许定义新的数据类型,函数,运算符和其他数据库对象。参见Chapter 38。实际上,内置对象是使用几乎相同的机制实现的。这种可扩展性意味着一些开销,例如由于函数调用(请参见Section 38.3)。为了减少这些开销,JIT 编译可以使用小函数的内联函数将其内联到表达式中。这样就可以将很大一部分开销进行优化。

32.1.3. Optimization

LLVM 支持优化生成的代码。其中一些优化足够便宜,可以在使用 JIT 时执行,而其他优化仅对运行时间较长的查询有利。有关优化的更多详细信息,请参见https://llvm.org/docs/Passes.html#transform-passes