Page 293 - 《软件学报》2026年第1期
P. 293

290                                                        软件学报  2026  年第  37  卷第  1  期


                    为了克服这些挑战, 后续端到端地取代现有传统优化器的方法基本上都应用了以下两种策略: 一是在训练初
                 期依赖传统优化器的策略, 借此提高机器学习模型的初始表现; 二是采用基于代价模型的奖励值计算方法, 避免直
                 接执行查询计划, 以加速模型的收敛.
                    Neo [39] 是第  1  个基于强化学习的端到端的查询优化器, 它利用现有优化器的优化模型作为起点, 并持续从新
                 查询中学习如何生成更优的查询执行计划. Neo              在一个基于    Tree-CNN  的代价模型的指导下执行一系列构造完整
                 计划的决策. 开始时, Neo     会先初始化一个最小堆, 堆中的每个元素都是一个未经指派扫描方式的叶子节点. 然后
                 Neo  会逐步为这些元素选择对应的扫描方式, 然后再在他们之间逐步选择连接方式, 将它们从一个个叶子节点出
                 发, 拼接成一个完整的查询计划. 在这个过程中              Neo  每次会选择堆中所有元素代价的最小值进行操作                (分配一个
                 扫描方式或连接方式和连接的位置). 一个元素              (实际上是一个子计划) 代价定义为所有可能包含该元素的完整计
                 划中代价的最小值. 从此处也可以看出, 计划生成类方法虽然也是在一步步构造计划, 但其每次评估的出发点却是
                 整个计划. 以此类推, 直到达到收敛条件为止. 即使是从一个非常简单的优化器作为起点的                            Neo, 也能学习出与当
                 前最先进的商业优化器性能相当的效果, 甚至在某些情况下可以超过它们. Neo                        证明了完全依赖于强化学习驱动
                 的, 端到端的查询优化器是可行的.
                    继  Neo  之后, 若干类似的工作延续了这样的思路: Balsa         [89] 从启动策略和训练策略的角度优化了模型的收敛效
                 率, 缩短了学习周期; LOGER     [90] 通过反向指定禁止操作符和奖励加权机制, 有效地解释了更优的计划为什么更优
                 的问题, 从而降低了模型发挥效果的波动性; GLO             [91] 通过聚类数据库的统计信息和增加与传统数据库产生的计划
                 进行对比, 大幅增加了泛化性, 降低了尾部性能退化. 表              4  对比了近年来端到端地进行计划生成的方法.

                                               表 4 端到端地计划生成方法对比

                     方法           启动引导         选择计划生成动作的方式               代价模型          与传统优化器的关系
                     Neo [39]  传统优化器生成               直接指定                Tree-CNN            依赖
                    Balsa [89]   模拟器生成               直接指定                Tree-CNN            无关
                   LOGER [90]       无                反向指定             Graph Transformer   利用但不依赖
                    GLO [91]        无                直接指定              类QueryFormer       利用但不依赖

                  4.2   辅助和指导优化器进行计划生成
                    虽然研究者们在改进端到端的方法上做出了许多贡献, 但是第                     4.1  节提到的  3  点缺陷一直未得到根治. 所以
                 一些研究者们决定在计划生成的方向上后退一步, 不再试图完全取代整个传统优化器, 而是辅助和指导传统查询
                 优化器进行计划生成. 其中的理论依据在于, 当传统优化器在进行计划生成时犯了一个小错误                             (比如一处连接顺序
                 选择错误), 虽然这个错误可能会导致性能骤降很多倍, 但是这终究是一个小错误导致的, 只需要对产生的计划进
                 行少数几处的修正就可以使其达到最优效果, 不必完全取代传统优化器                       [93] . 这样的方法的优势如下.
                    (1) 起点是传统优化器产生的计划, 下限较高, 无需担心很久效果才能收敛至与传统优化器相当.
                    (2) 辅助和指导操作的输出空间比端到端地构造计划的输出空间更小, 更容易收敛.
                    (3) 方法可解释性强, 可以通过模型的辅助和指导行为推断出传统优化器具体在哪方面发挥较差.
                    (4) 工程实现简便, 易于集成进现有的数据库系统中, 生产环境更容易接受.
                    目前辅助和指导传统优化器的主要方式是“提示”传统优化器中某些规则的开关.
                  4.2.1    使用“提示”辅助和指导传统优化器进行计划生成
                    Bao  是此类方法的代表     [61] . Bao  的作者在研究中揭示了一个新的发现: 对某些查询, 禁用某些传统优化器中的
                 优化规则可以产生更优的查询计划. 基于这一发现, 该文献提出了一种查询优化指导系统                            Bao, 它通过提示传统优
                 化器要使用哪些规则来生成更优的查询计划. 具体而言, Bao                 针对  PostgreSQL  数据库将  6  条特定优化规则的启用
                 与否作为“提示”, 形成了      48  种不同的“提示集”. 这些规则包括        3  种指定连接方式的规则和        3  种指定扫描方式的规
                 则. 在面对一个新的查询时, Bao       首先会进行规则开关的试验, 收集由这些规则组合引起的不同查询计划; 随后, 利
                 用基于 Tree-CNN  的代价模型估算每个计划的执行时间, 最终选择最优计划执行. 这种方法比传统的基于固定规
   288   289   290   291   292   293   294   295   296   297   298