Table of Contents
本章解释什么是即时编译,以及如何在PostgreSQL中配置它。
即时(Just-In-Time,JIT)编译是在运行时将某种形式的解释式程序求值转换为原生程序的过程。例如,与其使用能够对任意 SQL 表达式进行求值的通用代码来计算某个特定的 SQL 谓词(如 WHERE a.col = 3),不如生成一个专用于该表达式的函数,并让 CPU 以原生方式执行它,从而获得加速。
当 PostgreSQL 使用 --with-llvm 构建时,它内置了使用 LLVM 执行 JIT 编译的支持。
更多细节参见src/backend/jit/README。
当前,PostgreSQL 的 JIT 实现支持对表达式求值和元组拆解进行加速。未来还可能加速其他若干操作。
表达式求值用于计算 WHERE 子句、目标列表、聚合和投影。它可以通过为每种情况生成专用代码来加速。
元组拆解是将磁盘上的元组(见Section 63.6.1)转换为其内存表示的过程。它可以通过创建一个针对表布局和要提取的列数的专用函数来加速。
PostgreSQL 具有很强的可扩展性,允许定义新的数据类型、函数、操作符以及其他数据库对象;见Chapter 36。实际上,内置对象几乎也是通过相同的机制实现的。这种可扩展性意味着会有一些额外开销,例如函数调用带来的开销(见Section 36.3)。为了减少这类开销,JIT 编译可以把小函数的函数体内联到使用它们的表达式中,从而优化掉相当一部分开销。
LLVM 支持对生成的代码进行优化。有些优化的代价很低,因此每次使用 JIT 时都可以执行;另一些优化则只有在运行时间较长的查询中才有益处。更多有关优化的细节请参见https://llvm.org/docs/Passes.html#transform-passes。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。