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  编译系统引入条件下推, 扩
                 展了优化范围, 特别是在复杂查询中, 条件下推能够有效减少计算开销. 在筛选条件时, 模块结合优化器的统计信
                 息, 评估各个谓词的选择率, 优先下推选择率较低的谓词, 以减少数据量传输和接口调用. 为了避免无效下推, 只有
                 在谓词选择率低于给定阈值时, 才会将查询条件下推至存储引擎. 筛选出的条件会构建成一棵新的表达式树, 并将
                 运行时所需的过滤条件相关的字段编号和条件数量的信息一起下推至存储引擎. 剩余条件通过解释执行的方式处
   260   261   262   263   264   265   266   267   268   269   270