PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

30.1. 什么是 JIT 编译? #

30.1.1. JIT 加速的核心操作
30.1.2. 内联优化
30.1.3. 代码优化

即时编译(JIT)是指在程序运行时,将某种解释型的求值逻辑动态编译转化为宿主 CPU 能够直接执行的原生机器码的过程。 例如,为了计算形如 WHERE a.col = 3 的特定 SQL 谓词条件,传统方式是调用通用的解释器循环逐行比对;而借助 JIT,系统能在运行时就地生成专为该表达式量身定制的原生机器指令并直接交由 CPU 硬件运行,从而实现数倍的运算提速。

当在源码编译时开启了 --with-llvm 支持时,PostgreSQL 原生集成了利用 LLVM 编译器基础设施执行 JIT 动态编译的能力。

30.1.1. JIT 加速的核心操作 #

目前系统中的 JIT 重点针对两大高频计算瓶颈进行硬件级加速:表达式求值与元组拆解。

表达式求值广泛用于计算 WHERE 过滤条件、选择列表投影、聚合计算等。JIT 通过为具体表达式动态生成专用机器码消除解释器开销。

元组拆解(Tuple Deforming)是指将物理磁盘或共享内存缓冲区中的原始存储元组(参见 Section 66.6.1)解码并转化为内存结构化数据的过程。JIT 能够根据具体表的列定义与数据类型,生成专属的极速内存解析函数。

30.1.2. 内联优化 #

PostgreSQL 具备出色的可扩展性,允许自由扩展自定义函数与运算符(参见 Chapter 36)。然而频繁跨函数调用的物理开销在海量数据扫描时较为明显。JIT 编译能够将短小的函数体机器码直接内联展开(Inline)到外层引用它的表达式中,消除函数调用的栈帧压栈与跳转开销。

30.1.3. 代码优化 #

LLVM 内置了强大的指令级优化流水线。部分轻量优化(如常量折叠与公共子表达式消除)开销很低,在触发 JIT 时默认执行;而对于复杂长查询,还可以启用更激进的高级优化遍(Optimization Passes)。