参数化查询是一类具有相同模板且仅在谓词绑定参数上有所不同的查询,它们在现代数据库应用程序中被广泛使用。 他们执行重复的动作,这提供了优化其性能的机会。
然而,许多当前的商业数据库通过简单地优化查询中的第一个查询实例(或用户指定的实例)来处理参数化查询,缓存其最佳计划并将其重用于后续查询实例。 虽然该方法的优化时间最小化,但由于不同查询实例的最优计划不同,缓存计划的执行可能会任意次优,这在实际应用场景中并不适用
大多数传统的优化方法都需要对查询优化器进行许多假设,但这些假设通常不适合实际场景。 幸运的是,随着机器学习的兴起,这些问题可以得到有效的解决。 本期我们将重点介绍发表在VLDB2022和SIGMOD2023上的两篇文章
:《leveraging query logs and machine learning for parametric query optimization》
:《kepler: robust learning for faster parametric query optimization》
** 1 亮点
本文将参数化查询优化解耦为两个问题:
1) populatecache:缓存查询模板的 k 个计划;
2) getplan:对于每个查询实例,从缓存计划中选择最佳计划。
本**的算法架构如下图所示。 有两个主要模块:populatecache 和 getplan 模块。
PopulateCache 使用查询日志中的信息来缓存所有查询实例的 K 个计划。 GetPlan 模块首先通过与优化器交互来收集 k 个计划实例和查询实例之间的成本信息,并使用此信息来训练机器学习模型。 在 DBMS 中部署经过训练的模型。 当查询实例到达时,可以快速确定实例的最佳计划。
PolulateCache 模块负责为给定的参数化查询标识一组缓存计划,搜索阶段使用两个优化器 API:
优化器调用:返回优化器为查询实例选择的计划;
recost call:返回查询实例的优化器预估成本和对应的计划;
算法流程如下:
plan-collection phase:调用优化器调用,收集查询日志中 n 个查询实例的候选计划;
计划-重计费用阶段:对每个查询实例和每个候选计划调用重计费用调用,以形成计划-重计费用矩阵。
k-set 识别阶段:贪婪算法用于使用计划-重计费矩阵缓存 k 个计划,以最小化次乐观。
getplan 模块负责为给定的查询实例选择一个缓存的 k 个计划来执行。 GetPlan 算法可以考虑两个目标:最小化优化器估计的成本,或最小化 k 个缓存计划实际执行的成本。
考虑目标 1:使用计划-重成本矩阵训练监督式 ML 模型,同时考虑分类和回归。
考虑目标 2:使用基于多臂强盗的强化学习来训练模型。
** 2 亮点
该文提出一种端到端的、基于学习的参数化查询优化方法,旨在减少查询优化时间,提高查询执行性能。
开普勒还将问题解耦为两部分:计划生成和基于学习的计划预测。 有三个主要阶段:计划生成策略、训练查询执行阶段和鲁棒神经网络模型。
如上图所示,查询日志中的查询实例输入给 Kepler Trainer,Kepler Trainer 首先生成一个候选计划,然后收集与候选计划相关的执行信息,将其作为训练数据来训练机器学习模型,训练后将模型部署到 DBMS 中。 当查询实例到达时,使用 kepler 客户端进行最佳计划和执行。
在本文中,我们提出了一种称为行计数演变(RCE)的候选计划生成算法,该算法通过扰动优化器的基数估计来生成候选计划。
该算法的思想是,基数的错误估计是优化器次优的主要原因,候选计划生成阶段只需要包含一个实例的最优计划,而不是选择单个最优计划。
RCE算法首先为查询实例生成最优计划,然后在指数区间范围内扰动其子计划的连接基数,多次重复,多次迭代,最后将所有生成的计划选为候选计划。 具体示例如下:
使用 RCE 算法,生成的候选计划可能会优于优化器生成的候选计划。 由于优化器可能存在基数估计误差,因此 RCE 通过不断扰动基数估计来生成正确基数的最佳计划。
获得候选计划集后,将对每个查询实例的工作负载执行每个计划,并收集真实执行时间以训练监督最优计划模型。 上述过程比较繁琐,本文提出了一些加速训练数据采集的机制,如并行执行和自适应超时机制。
使用生成的真实执行数据训练神经网络,以便为每个查询实例进行最佳规划。 其中使用的神经网络是高斯神经过程的谱归一化,保证了网络的稳定性和训练的收敛性,可以为世界提供不确定性估计。 当不确定性估计值大于某个阈值时,由优化器选择执行计划。 在一定程度上避免了性能回归。
总结
以上两者都将参数化查询解耦为两部分,即 populatecache 和 getplan。 两者的比较如下表所示。
基于机器学习模型的算法在规划方面表现良好,但其训练数据收集过程成本高昂,且模型不易泛化和更新。 因此,现有的参数化查询优化方法仍有一定的改进空间。
本文图解**:
1)kapil vaidya & anshuman dutt, 《leveraging query logs and machine learning for parametric query optimization》, 2022 vldb,2)lyric doshi & vincent zhuang, 《kepler: robust learning for faster parametric query optimization》, 2023 sigmod,