Page 265 - 《软件学报》2026年第3期
P. 265
1228 软件学报 2026 年第 37 卷第 3 期
编译: 快速编译 (Liftoff) 和优化编译 (TurboFan), 这使得在执行过程中可以逐渐替换代码, 实现从非优化代码到完
全优化代码的动态替换, 从而在不牺牲性能的同时显著减少编译时间. WebAssembly 是一个新兴的技术, 它不提供
标准库, 这意味着需要为每个查询定制所有必要的算法和数据结构的代码, 不如传统的编译基础设施 (如 LLVM)
成熟. 并且该架构主要针对特定的硬件架构 (x86 体系) 进行了优化. 对于不同的硬件架构, 可能需要额外的工作来
确保代码的高效执行. 得益于项目的模块化设计, 上述编译器框架可以作为本文代码生成技术的候选, 替换代码生
成相关 LLVM C++ API 即可.
与本文工作最相关的是华为云 GaussDB for MySQL 以及 AWS Aurora 针对云数据库的优化 [21,22] , 将 SQL 查
询的过滤操作编译成字节码然后下推到存储层, 达到近数计算效果 (华为使用 LLVM 将 SQL 查询转换成字节码,
AWS Aurora 研究团队没有公布采用的技术细节). 上述两家云计算厂商在现有成熟的数据库系统上将 SQL 转换
成字节码, 使用优化器动态确定解释执行或者是编译执行过滤操作. 他们的技术也可以推广到可插拔引擎架构下.
但是他们并未给出相关的技术实现细节, 也不支持混合执行模式.
2 系统整体架构
针对 Volcano 执行器的不足以及日益流行的可插拔数据库系统架构, 本文相应给出若干 JIT 编译优化方案,
并在 MySQL 数据库中进行验证, 我们称其为 MySQLJ.
图 1 展示了 MySQLJ 的整体框架与对应的论文内容组织, 包含以下 4 个重要模块.
客户端
第3.2节 第3.3节
SQL 查询 谓词提取 Result
Item tree
ࢳ༅ఖ
选择率评估
Ⴊ߄ఖ LLVM IR
执行器
JIT 实例初始化 执行计划 字段模版 ࠏఖս
第3.1节 下推
存储引擎层 Handler 接口
第3.4节
机器代码提前过滤
DATA DATA
图 1 JIT 编译系统的整体架构设计示意图
(1) JIT 编译准备模块. 该模块主要功能是根据查询特点决定使用编译执行还是系统的解释执行. 首先, 模块分
析 SQL 查询所涉及的元组数目和谓词表达式数量, 并与预设的阈值进行比较, 判断是否选择 JIT 编译. 若使用编
译执行, 接下来编译模块将构建一个适配目标机器的 JIT 编译实例. 具体来说, 模块首先会创建执行控制对象来管
理编译过程中的资源和执行环境. 然后, 生成适用于目标机器的编译环境, 并获取目标机器相关信息例如 CPU 型
号、内存布局等, 以确保生成的代码与硬件兼容. 最后, 编译模块会创建执行会话和相关管理工具, 确保编译后的
代码能够顺利加载并执行. 我们将在第 3.1 节介绍 MySQLJ 编译执行的适用场景及 JIT 编译实例的初始化过程.
(2) 表达式筛选模块. 该模块的主要功能是筛选出适合下推至存储引擎的谓词表达式. 随着可插拔架构的日益
流行, 将查询条件下推到存储引擎在很多场景中可以带来实质性收益 [23] . 因此, 将 JIT 编译系统引入条件下推, 扩
展了优化范围, 特别是在复杂查询中, 条件下推能够有效减少计算开销. 在筛选条件时, 模块结合优化器的统计信
息, 评估各个谓词的选择率, 优先下推选择率较低的谓词, 以减少数据量传输和接口调用. 为了避免无效下推, 只有
在谓词选择率低于给定阈值时, 才会将查询条件下推至存储引擎. 筛选出的条件会构建成一棵新的表达式树, 并将
运行时所需的过滤条件相关的字段编号和条件数量的信息一起下推至存储引擎. 剩余条件通过解释执行的方式处

