即时 (JIT) 编译是一个将某些形式的解释程序评估转为本机程序的过程,并且在运行时执行此操作。例如,有可能针对该表达式生成一个特定于该表达式的函数,即该函数可由 CPU 以本机方式执行,从而产生加速度,而不是使用通用代码来评估任意的 SQL 表达式,以评估诸如 WHERE a.col = 3
的特定 SQL 谓词。
PostgreSQL 具有使用 LLVM 执行JIT编译的内置支持,即当 PostgreSQL 使用 --with-llvm
进行构建时。
请参阅 src/backend/jit/README
以了解更多详细信息。
目前 PostgreSQL 的JIT实现支持加速表达式评估和元组变形。未来可能会加速其他一些操作。
表达式求值用于评估 WHERE
子句、目标列表、聚合和投影。可以通过为每种情况生成特定代码来对其进行加速。
元组变形是指将磁盘元组(参见 65.6.1 节)转换为其内存中表示的过程。可以通过针对表布局和要提取的列数创建特定函数来对其进行加速。
PostgreSQL 具有很强的可扩展性,允许定义新的数据类型、函数、运算符和其他数据库对象;请参见 第 36 章。事实上,内置对象几乎使用相同的机制来实现。这种可扩展性会带来一些开销,例如函数调用会导致开销(参见 36.3 节)。为了降低开销,JIT编译会将小函数的主体内嵌到使用它们的表达式中。这样可以优化掉显著比例的开销。
LLVM 支持优化生成的代码。一些优化很便宜,可在任何时候执行JIT时执行,而另一些优化仅适用于运行时间较长的查询。请参见 https://llvm.net.cn/docs/Passes.html#transform-passes 了解有关优化的更多详细信息。