即时 (JIT) 编译是将某种形式的解释型程序求值转换为本地程序的过程,并在运行时进行。例如,与其使用通用的代码来求值特定的 SQL 谓词(如 WHERE a.col = 3
),不如生成一个特定于该表达式的函数,该函数可以由 CPU 原生执行,从而提高速度。
PostgreSQL 内置支持执行JIT编译,当 PostgreSQL 使用 LLVM 构建时(使用 --with-llvm
)。
有关更多详细信息,请参阅 src/backend/jit/README
。
目前 PostgreSQL 的JIT实现支持加速表达式求值和元组变形。未来还可以加速其他几种操作。
表达式求值用于评估 WHERE
子句、目标列表、聚合和投影。可以通过为每种情况生成特定代码来加速它。
元组变形是将磁盘上的元组(请参阅 第 66.6.1 节)转换为其内存表示的过程。通过创建特定于表布局和要提取的列数的函数来加速它。
PostgreSQL 非常可扩展,允许定义新的数据类型、函数、运算符和其他数据库对象;请参阅 第 36 章。事实上,内置对象也是使用几乎相同的机制实现的。这种可扩展性意味着存在一些开销,例如由于函数调用(请参阅 第 36.3 节)。为了减少这种开销,JIT编译可以将小函数的正文内联到使用它们的表达式中。这可以消除相当大一部分的开销。
LLVM 支持优化生成的代码。其中一些优化足够廉价,可以随时执行,而另一些优化仅对运行时间更长的查询有益。有关优化的更多详细信息,请参阅 https://llvm.net.cn/docs/Passes.html#transform-passes。JIT是随时执行的,而另一些优化仅对运行时间更长的查询有益。有关优化的更多详细信息,请参阅 https://llvm.net.cn/docs/Passes.html#transform-passes。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表格 报告文档问题。