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

一、背景介绍

参数化查询是指具有相同模板,且只有谓词绑定参数值不同的一类查询,它们被广泛应用在现代数据库应用程序中。它们存在反复执行动作,这为其性能优化提供了契机。

然而,当前许多商业数据库处理参数化查询的方法仅仅只优化查询中的第一条查询实例(或用户指定的实例),缓存其最佳计划并为后续的查询实例重用。该方法虽然优化时间至最小化,但由于不同查询实例的最佳计划不同,缓存计划的执行可能是任意次优的,这在实际应用场景中并不适用。

大多数传统优化方法需对查询优化器进行许多假设,但这些假设通常不符合实际应用场景。好在随着机器学习的兴起,上述问题可以得以有效解决。本期将围绕发表于 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 中。当一个查询实例到达时,可快速预测出该实例的最佳计划。

PopulateCache

PolulateCache 模块负责为给定的参数化查询识别一组缓存计划,搜索阶段利用两个优化器 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 个计划,最小化次优性。
getPlan

getPlan 模块负责为给定的查询实例,从缓存的 K 个计划中选择一个用于执行。getPlan 算法可以考虑两个目标:在 K 个缓存计划中,最小化优化器估计的 cost 或最小化实际执行的 cost。

考虑目标 1:利用 plan-recost matrix 训练监督 ML 模型,可考虑分类和回归。
在这里插入图片描述

考虑目标 2:利用基于多臂赌博机( Multi-Armed Bandit )的强化学习训练模型。在这里插入图片描述

三、论文 2 精华讲解

《Kepler: Robust Learning for Faster Parametric Query Optimization》该论文提出一种端到端、基于学习的参数化查询优化方法,旨在减少查询优化时间的同时,提高查询的执行性能。

算法架构如下,Kepler 同样将问题解耦为两部分:plan generation 和 learning-based plan prediction。主要分为三个阶段:plan generation strategy、training query execution phase 和 robust neural network model。
在这里插入图片描述

如上图所示,将查询日志中的查询实例输入给 Kepler Trainer,Kepler Trainer 首先生成候选计划,然后收集候选计划相关的执行信息,作为训练数据训练机器学习模型,训练好后将模型部署于 DBMS 中。当查询实例到来时,利用 Kepler Client 预测最佳计划并执行。

Row Count Evolution

本文提出一种名为 Row Count Evolution (RCE) 的候选计划生成算法,通过扰动优化器基数估计生成候选计划。

该算法的想法来源:基数的错误估计是优化器次优性的主要原因,并且候选计划生成阶段只需要包含一个实例的最优计划,而不是选出单一的最优计划。

RCE 算法首先为查询实例生成最优计划,而后在指数间隔范围内扰动其子计划的 join cardinality,重复多次并进行多次迭代,最终将生成的所有计划作为候选计划。具体实例如下:
在这里插入图片描述

通过 RCE 算法,生成的候选计划可能优于优化器产生的计划。因为优化器可能存在基数估计错误,而 RCE 通过不断扰动基数估计,可产生正确基数对应的最佳计划。

Training Data Collection

得到候选计划集后,在 workload 上为每个查询实例执行每个计划,收集真实执行时间,用于有监督最佳计划预测模型的训练。上述过程较为繁琐,本文提出一些机制来加速训练数据的收集,如并行执行、自适应超时机制等。

Robust Best-Plan Prediction

利用得到的实际执行数据训练神经网络,为每个查询实例预测最佳计划。其中采用的神经网络为谱归一化高斯神经过程,该模型确保网络的稳定性和训练的收敛性的同时,可以为预测提供不确定性估计。当不确定性估计大于某个阈值时,交给优化器选择执行计划。一定程度上避免了性能的回归。

四、总结

上述两篇论文都将参数化查询解耦为 populateCache 和 getPlan 两部分。二者的对比如下表所示。
在这里插入图片描述

基于机器学习模型的算法虽然在计划预测方面表现良好,但其训练数据收集过程较为昂贵,且模型不易于泛化和更新。因此,现有参数化查询优化方法仍有一定的提升空间。

本文图示来源:
1)Kapil Vaidya & Anshuman Dutt, 《Leveraging Query Logs and Machine Learning for Parametric Query Optimization》, 2022 VLDB,https://dl.acm.org/doi/pdf/10.14778/3494124.3494126

2)LYRIC DOSHI & VINCENT ZHUANG, 《Kepler: Robust Learning for Faster Parametric Query Optimization》, 2023 SIGMOD,https://dl.acm.org/doi/pdf/10.1145/3588963

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码运行时内存分区

计算机科学中,代码运行时的内存通常划分为以下分区: 堆栈 静态区 活跃区 代码段 常量存储区 全局/静态数据区 只读数据区 BSS 段 ----------------------------------- | 代码段 | ----------------------------------- | …

LeetCode--1445. 苹果和桔子

文章目录 1 题目描述2 测试用例3 解题思路 1 题目描述 表: Sales ------------------------ | Column Name | Type | ------------------------ | sale_date | date | | fruit | enum | | sold_num | int | ------------------------(sale…

Uibot (RPA设计软件)智能识别信息+微信群发助手(升级版)———课后练习2

解决痛点: Excel如何计算两个日期之间相差月数 方法: 1、首先打开要进行操作的Excel表格。 2、打开后选中要计算相差月数的单元格。 3、然后输入公式:DATEDIF(A2,B2,"m"),输入完成后点击回车键。 4、在弹出的窗口中&a…

Rancher实用篇-使用rancher,部署微服务应用

说到rancher,我们必须先了解一下k8s 一、k8s简介 Kubernetes(通常简写为 K8s)是一个开源的容器管理系统,由Google于2014年发起,并在2015年贡献给Cloud Native Computing Foundation (CNCF)进行维护。它基于Borg项目的…

202427读书笔记|《猫的自信:治愈系生活哲学绘本》——吸猫指南书,感受猫咪的柔软慵懒与治愈

202427读书笔记|《猫的自信:治愈系生活哲学绘本》——吸猫指南书,感受猫咪的柔软慵懒与治愈 《猫的自信:治愈系生活哲学绘本》作者林行瑞,治愈系小漫画绘本,10分钟可以读完的一本书,线条明媚,自…

Linux-RT特点与简单应用

Linux-RT是指Linux Real-Time(实时)的简称,它是针对实时性能优化的Linux内核版本。传统的Linux内核并不是专为实时性设计的,因此在一些对实时性要求较高的应用场景下,可能无法满足实时性要求。Linux-RT通过对Linux内核…

【VTKExamples::PolyData】第三十四期 MiscPointData GetMiscPointData

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例MiscPointData,该样例主要介绍如何为PolyData添加PointData属性数据。 VTK样例GetMiscPointData,该样例介绍如何获取PointData属性数据。 希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞…

量化巨头“卖空”被刷屏!网友:又一类量化策略要“收摊”了

量化圈遇到了龙年首宗“大事件”! 2月20日晚间,沪深交易所同时出手对量化巨头灵均投资的异常交易行为进行“处理”。 沪深交易所均称发现灵均在2月19日开盘1分钟内,名下多个账户通过计算机程序自动生产交易指令,短时间大量下单卖…

公寓报修|公寓报修管理系统|基于springboot公寓报修管理系统设计与实现(源码+数据库+文档)

公寓报修管理系统目录 目录 基于springboot公寓报修管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、住户管理 2、房间管理 3、维修人员管理 4、维修分类管理 5、物品信息管理 6、维修申请管理管理 四、数据库设计 1、实体ER图 五、核心代码 六、…

IO 作业 24/2/20

一、思维导图 二、习题 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fpNULL;FILE *fqNULL;pid_t pidfork();if(pid>0){if((fpfopen("./text.txt","r"))NULL){perror("fopen error");return -1;} if((f…

天机星在十二宫

文章目录 前言内容总结 前言 天机星在十二宫 内容 天机星在十二宫 天机属木&#xff0c;南斗第三益算是善星&#xff0c;化气为善。 天机星为轴星&#xff0c;有此天机轴星&#xff0c;方能订十八星曜之位。 天机为兄弟宮主。是动星&#xff0c;似轮轴不停转动&#xff0c;…

C++桌面应用开发+编译环境搭建指导

C桌面应用开发编译环境搭建指导 此帖目的&#xff1a;记录本人初次使用Visual Studio 2022(以下简称VS)IDE软件进行Windows桌面应用开发的环境搭建过程&#xff0c;以期对具有相同情况、初次使用和搭建VS开发编译环境进行C开发的小白程序员提供参考作用。 1.下载VS IDE Insta…

鸿蒙将与安卓应用形成“硬分叉”,多家平台急聘鸿蒙开发员

最近&#xff0c;网友注意到&#xff0c;多家企业公布了鸿蒙系统有关的岗位招聘。 11 月 8 日&#xff0c;美团发布了鸿蒙高级工程师、鸿蒙基建工程师等多个鸿蒙开发相关岗位。主要开发美团鸿蒙App、大众点评鸿蒙App。 根据脉脉平台&#xff0c;美团鸿蒙基建工程师岗位给出的…

C++ 二分模版 数的范围

给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q 个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 0 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1 -1。 输入格式 第一行包含整数 n 和 q &…

HBM可以解决冯诺伊曼架构的陷阱吗?

高带宽内存&#xff08;High Bandwidth Memory, HBM&#xff09;在一定程度上缓解了冯诺伊曼架构中处理器与主存之间的通信瓶颈问题&#xff0c;但并不能完全解决冯诺伊曼陷阱。 HBM是一种先进的3D堆叠式内存技术&#xff0c;它通过将多个DRAM芯片垂直堆叠在一起&#xff0c;并…

C++的std::vector

std::vector是C标准库中的一个序列容器&#xff0c;它封装了动态大小数组的行为。std::vector允许你在运行时动态地添加和删除元素&#xff0c;自动管理存储空间的分配和释放。由于其灵活性和易用性&#xff0c;std::vector在C程序中被广泛使用&#xff0c;特别是在需要存储一系…

JavaScript中手动实现Array.prototype.map方法

在前端开发中&#xff0c;我们经常需要对数组进行操作和处理。在JavaScript中&#xff0c;数组是常用的数据类型之一。而数组的map方法可以将一个数组中的每个元素都进行某种操作&#xff0c;并返回一个新的数组。今天&#xff0c;我们就来手动实现JavaScript中数组原型的map方…

Spring Bean 的生命周期了解么?

Spring Bean 的生命周期基本流程 一个Spring的Bean从出生到销毁的全过程就是他的整个生命周期, 整个生命周期可以大致分为3个大的阶段 : 创建 使用 销毁 还可以分为5个小步骤 : 实例化(Bean的创建) , 初始化赋值, 注册Destruction回调 , Bean的正常使用 以及 Bean的销毁 …

c++基础回顾之引用

定义 与指针相似的是&#xff0c;引用将存储位于内存中其他位置的对象的地址。 与指针不同的是&#xff0c;初始化之后的引用无法引用不同的对象或设置为 null。 声明方式 # 引用、指针和对象可以一起声明 int &ref, *ptr, k;引用保留对象的地址&#xff0c;但语法行为与对…

​ 安达发|APS排程软件的动态合并优化详解

在制造业中&#xff0c;为了提高生产效率、降低成本并满足客户需求&#xff0c;企业需要采用先进的人工智能算法APS系统。APS&#xff08;高级计划与排程&#xff09;系统作为一种强大的工具&#xff0c;可以帮助企业实现这一目标。本文将详细介绍APS排程软件的动态合并优化功能…