关于查询优化:基于学习的参数化查询优化方法

一、背景介绍参数化查问是指具备雷同模板,且只有谓词绑定参数值不同的一类查问,它们被广泛应用在古代数据库应用程序中。它们存在重复执行动作,这为其性能优化提供了契机。 然而,以后许多商业数据库解决参数化查问的办法仅仅只优化查问中的第一条查问实例(或用户指定的实例),缓存其最佳打算并为后续的查问实例重用。该办法尽管优化工夫至最小化,但因为不同查问实例的最佳打算不同,缓存打算的执行可能是任意次优的,这在理论利用场景中并不实用。 大多数传统优化办法需对查问优化器进行许多假如,但这些假如通常不符合实际利用场景。好在随着机器学习的衰亡,上述问题能够得以无效解决。本期将围绕发表于 VLDB2022 和 SIGMOD2023 的两篇论文开展具体介绍: 论文 1:《Leveraging Query Logs and Machine Learning for Parametric Query Optimization》论文 2:《Kepler: Robust Learning for Faster Parametric Query Optimization》 二、论文 1 精髓解说《Leveraging Query Logs and Machine Learning for Parametric Query Optimization》此篇论文将参数化查问优化解耦为两个问题:(1)PopulateCache:为一个查问模板缓存 K 个打算;(2)getPlan:为每个查问实例,从缓存的打算中抉择最佳打算。 该论文的算法架构如下图所示。次要分为两个模块:PopulateCache 和 getPlan module。 PopulateCache 利用查问日志中的信息,为所有查问实例缓存 K 个打算。getPlan module 首先通过与优化器交互收集 K 个打算与查问实例之间的 cost 信息,利用该信息训练机器学习模型。将训练好的模型部署于 DBMS 中。当一个查问实例达到时,可疾速预测出该实例的最佳打算。 PopulateCachePolulateCache 模块负责为给定的参数化查问辨认一组缓存打算,搜寻阶段利用两个优化器 API: Optimizer call:返回优化器为一个查问实例抉择的打算;Recost call:为一个查问实例和对应打算返回优化器预计的 cost;算法流程如下: Plan-collection phase:调用 optimizer call,为查问日志中 n 个查问实例收集候选打算;Plan-recost phase:为每个查问实例,每个候选打算,调用 recost call,造成 plan-recost matrix;K-set identification phase:采纳贪婪算法,利用 plan-recost matrix 缓存 K 个打算,最小化次优性。getPlangetPlan 模块负责为给定的查问实例,从缓存的 K 个打算中抉择一个用于执行。getPlan 算法能够思考两个指标:在 K 个缓存打算中,最小化优化器预计的 cost 或最小化理论执行的 cost。 ...

February 19, 2024 · 1 min · jiezi