
余翔 等: AlphaQO: 鲁棒的学习型查询优化器
815
otherwise, the query generator will get a low reward. The above process is performed iteratively, with the main goal that within a small
budget, the learned optimizer can be trained and generalized well to a wide range of unseen queries. Extensive experiments show that
AlphaQO can generate a relatively small number of queries and train a learned optimizer to outperform commercial optimizers. Moreover,
learned optimizers need much l ess queries fro m AlphaQO than randomly generated queries, in order to well train the l earned optimi zer.
Key words: learned optimizer; robust ness; AI4 DB; database; r einfor cement learning; qu ery generation
查询优化器决定着数据库引擎执行一条查询时所采用的具体方案, 是决定数据库系统成功与否的核心部
件
[1−3]
. 传统的查询优化器
[4−7]
主要使用的是基于代价的方法: 给定一个 SQL 查询, 优化器会尝试枚举不同的
可能的执行方案, 然后交给估计器估计每个方案的执行代价, 从中选出最小代价的那个方案. 传统的方法往
往受限于两个问题.
• L1: 枚举代价过高. 可能的方案空间往往是指数级的, 基于动态规划的方法需要大量的计算, 而启发
式的方法不一定能取得较好的结果.
• L2: 代价估计模型难以维护. 维护一个好的估计器是非常难的, 不同的系统环境、存储结构、数据集
需要不同的代价模型参数; 同时, 基数估计的准确性也显著影响着估计器的效果.
近段时间, 一些研究者开始使用基于学习的方法对传统优化器进行改进
[8−11]
, 并在 L1 和 L2 上取得了不
错的效果. 他们研究发现, 对比目前已有的数据库管理系统, 学习型优化器可以提供相近甚至更高的性能. 然
而学习型优化器往往使用的是深度学习模型, 效果往往依赖于模型训练的情况. 一般来讲有两个难点.
• L3: 冷启动问题. 如果学习型优化器依赖于大量的真实查询来训练, 一直在线上收集查询并训练, 比
如 NEO
[8]
, 我们会需要很久的时间让学习型优化器收集数据、训练, 以产生较好的效果.
• L4: 鲁棒性问题. 基于学习的优化器的质量往往取决于训练集的质量, 在收集数据的质量不高, 或者
使用随机生成的查询来训练的情况下, 学习型的优化器不一定能够对未来的真实查询取得一个较好
的结果, 从而导致系统的失效.
因此, 我们这篇文章主要解决一个问题: 不仅仅依赖于线上收集大量真实的负载, 我们能否提前发现学
习型优化器做得不好的查询, 交给学习型优化器训练, 提高其鲁棒性?
一个自然而然的想法是生成大量的随机查询, 尽可能地覆盖所有的情况. 然而, 这个做法会十分消耗时
间而并不实用: 首先, 可能的查询数量是十分巨大的, 不同的连接、不同的谓词选择, 会产生指数级别的查询
搜索空间; 同时, 学习型优化器训练一条查询的代价也是非常高的, 需要使用不同的方案在数据库管理系统
上执行该查询得到足够的训练数据. 这些都导致了单纯的随机生成无法解决我们的问题.
我们需要尽量减小生成查询的数量, 提高生成查询的质量, 选择有效的查询交给学习型优化器作为训练
数据. 考虑到学习型优化器一般从那些已经做得好的查询上学不到太多信息, 我们希望查询生成器能够识别
学习型优化器目前做得不好的查询(质量高). 我们使用迭代的方式, 首先由查询生成器生成查询提供给学习
型优化器测试, 然后得到反馈并改进查询生成器的生成方向.
• 贡献
在这篇文章中, 我们提出了一个通用的鲁棒优化器训练框架 AlphaQO, 目的是基于深度强化学习(deep
reinforment learning, DRL)发现学习型优化器做得不好的查询, 并以此提高学习型优化器的鲁棒性. 图 1 总结
了我们 Al
phaQO 的系统架构, 这是一个循环的结构, 主要包含了一个查询生成器(主体, agent)和一个学习型优
化器(环境, environment). 查询生成器迭代地生成查询, 交给学习型优化器. 学习型优化器将测试这些查询,
并给出对应的奖励值(reward), 用于指导查询生成器的生成方向; 之后, 用这些查询训练自己提高性能. 更具
体地来讲, 在第 i 个迭代过程中, 查询生成器会根据策略函数生成查询集合 Q
i
, 交给学习型优化器. 学习型优
化器拿到这个查询集合 Q
i
以后, 会与后端的数据库管理系统(DBMS)交互, 来对比看是否超过了传统优化器
的性能, 并根据对比情况返回奖励值集合 R
i
给查询生成器. 最后, 学习优化器利用这些查询 Q
i
作为训练数据
进行训练, 并更新系统的状态为 S
i
. 这些奖励值 R
i
会被用于生成器的策略函数, 指导查询生成器下一次迭代
过程中的结果.
评论