支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11

30.1. 什么是JIT编译? #

即时 (JIT) 编译是将某种形式的解释程序求值转换为本地程序,并在运行时执行此操作的过程。例如,可以使用能够评估任意 SQL 表达式的通用代码来评估特定的 SQL 谓词,例如 WHERE a.col = 3,但可以生成一个特定于该表达式并且可以由 CPU 本机执行的函数,从而提高速度。

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

有关详细信息,请参阅 src/backend/jit/README

30.1.1. JIT加速操作 #

当前,PostgreSQLJIT实现支持加速表达式求值和元组变形。未来可能会加速其他几种操作。

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

元组变形是将磁盘上的元组(请参阅 第 65.6.1 节)转换为其内存表示形式的过程。可以通过创建一个特定于表布局和要提取的列数的函数来加速它。

30.1.2. 内联 #

PostgreSQL 非常可扩展,并允许定义新的数据类型、函数、运算符和其他数据库对象;请参阅第 36 章。事实上,内置对象是使用几乎相同的机制实现的。这种可扩展性意味着一些开销,例如由于函数调用(请参阅第 36.3 节)。为了减少这种开销,JIT编译可以将小函数的函数体内联到使用它们的表达式中。这允许优化掉很大一部分开销。

30.1.3. 优化 #

LLVM 支持优化生成的代码。一些优化足够廉价,可以在每次使用JIT时执行,而另一些优化仅对运行时间较长的查询有益。有关优化的更多详细信息,请参阅 https://llvm.net.cn/docs/Passes.html#transform-passes

提交更正

如果您在文档中发现任何不正确、与特定功能的使用体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。