登录
32.1. 什么是JIT编译?#
即时编译 (JIT) 是将某种形式的解释程序评估转换为本机程序的过程,并在运行时执行此操作。例如,可以使用通用代码(该代码可以评估任意 SQL 表达式)来评估特定 SQL 谓词(如WHERE a.col = 3
),但也可以生成特定于该表达式的函数,并由 CPU 本机执行,从而提高速度。
PostgreSQL在使用LLVM构建PostgreSQL时内置了使用JIT编译的支持,前提是使用--with-llvm
构建PostgreSQL。
有关更多详细信息,请参阅src/backend/jit/README
。
32.1.1.JIT加速操作#
目前,PostgreSQL的JIT实现支持加速表达式评估和元组变形。未来可能会加速其他几个操作。
表达式评估用于评估WHERE
子句、目标列表、聚合和投影。可以通过生成特定于每种情况的代码来加速它。
元组变形是将磁盘上的元组(参见第 73.6.1 节)转换为其内存中表示的过程。可以通过创建一个特定于表布局和要提取的列数的函数来加速此过程。
32.1.2. 内联#
PostgreSQL具有很强的可扩展性,允许定义新的数据类型、函数、运算符和其他数据库对象;参见第 38 章。事实上,内置对象使用几乎相同的机制实现。这种可扩展性意味着一些开销,例如由于函数调用(参见第 38.3 节)。为了减少开销,JIT编译可以将小函数的主体内联到使用它们的表达式中。这允许优化掉很大一部分开销。
32.1.3. 优化#
LLVM支持优化生成的代码。一些优化足够便宜,可以在每次使用JIT时执行,而另一些优化只对长时间运行的查询有好处。有关优化的更多详细信息,请参见https://llvm.org/docs/Passes.html#transform-passes。