2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11

30.1. 什么是JIT编译? #

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

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

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

30.1.1. JIT加速操作 #

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

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

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

30.1.2. 内联 #

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

30.1.3. 优化 #

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

提交更正

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