即时 (JIT) 编译是将某种形式的解释程序评估转换为本地程序的过程,并且在运行时执行此过程。例如,与其使用可以评估任意 SQL 表达式的通用代码来评估特定的 SQL 谓词(如 WHERE a.col = 3
),不如生成一个特定于该表达式的函数,该函数可以由 CPU 本地执行,从而提高速度。
PostgreSQL 内置支持执行JIT使用 LLVM 进行编译,前提是 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。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。