Postgresql 中文操作指南
32.1. What Is JIT compilation? #
即时编译 (JIT) 是将某种形式的解释程序评估转换为本机程序并使其在运行时执行的过程。例如,与其使用通用的代码来评估任意 SQL 表达式以评估 WHERE a.col = 3 这样的特定 SQL 谓词,可以生成专门针对该表达式的函数,然后可以由 CPU 原生执行,从而提高速度。
当使用 —with-llvm 构建 PostgreSQL 时,PostgreSQL 具有内置支持来使用 LLVM 执行 JIT 编译。
有关更多详细信息,请参见 src/backend/jit/README。
32.1.1. JIT Accelerated Operations #
当前 PostgreSQL 的 JIT 实施支持加速表达式评估和元组变形。将来可能会加速其他几种操作。
表达式评估用于评估 WHERE 子句、目标列表、聚合和投影。它可以通过针对每种情况生成特定的代码来加速。
元组变形是将磁盘元组(参见 Section 73.6.1)转换成其内存中表示的过程。通过创建特定于表布局和要提取的列数的函数,可以加速它。
32.1.2. Inlining #
PostgreSQL 很容易扩展,并且允许定义新的数据类型、函数、运算符和其他数据库对象;参见 Chapter 38。事实上,内置对象几乎使用相同的机制实现。这种可扩展性意味着一些开销,例如由于函数调用(参见 Section 38.3)。为了减少这种开销,JIT 编译可以将小函数的主体内联到使用它们的表达式中。这允许通过优化消除大量的开销。
32.1.3. Optimization #
LLVM 支持针对生成代码进行优化。一些优化足够廉价,可以在每次使用 JIT 时执行,而另一些优化只对长期运行的查询有益。有关优化的更多详细信息,请参见 https://llvm.org/docs/Passes.html#transform-passes。