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

一、背景介绍

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大顶堆、小顶堆

堆 堆堆的维护1.自我初始化代码2.插入时维护时间复杂度 代码如有误欢迎指出 本文是最近在整理排序算法的时候写到堆排序单拎出来写的,目前只有维护代码 堆 堆是一颗完全二叉树,同时保证所有双亲都比自己的孩子大(可以相等 堆的维护 使用数…

【无标题】力扣报错:member access within null pointer of type ‘struct ListNode‘

项目场景: 做单链表反转题目,报错:member access within null pointer of type ‘struct ListNode’ 题目链接:LINK 问题描述 我明明在初始化指针时候,已经处理了n2->next情况却依然报错 这个报错提示含义是:大概就…

VNCTF2024misc方向部分wp

文章目录 sqlsharkLearnOpenGLez_msbOnlyLocalSql sqlshark tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt不太像常规的盲注,一次性发送两条很类似的payload,比常规的多了一个least在判断passw…

C语言——从头开始——深入理解指针(1)

一.内存和地址 我们知道计算上CPU(中央处理器)在处理数据的时候,是通过地址总线把需要的数据从内存中读取的,后通过数据总线把处理后的数据放回内存中。如下图所示: 计算机把内存划分为⼀个个的内存单元,每…

python-pyqt5-工具按钮(QToolButton)添加菜单(QMenu)

QToolButton提供了比普通按钮更丰富的功能。它可以显示一个图标、一个文本或二者结合,还支持各种样式和行为,例如弹出菜单或多种动作模式 样式 setToolButtonStyle(Qt.ToolButtonStyle) # 设置按钮样式风格# 参数Qt.ToolButtonIconOnly …

Window系统GPT-SoVITS配置安装

GPT-SoVITS配置安装 GPT-SoVITS配置Python下载以及安装源文件安装依赖 运行整理在安装配置环境时遇到的报错总结 GPT-SoVITS配置 作者链接 Python下载以及安装 版本这里根据教程的版本走即可,这里不会安装python或者不会配置环境的参考我之前的文章 Python 3.9,…

Requests教程-11-重定向与请求历史

领取资料,咨询答疑,请➕wei: June__Go 上小节中,我们学习了requests的Session会话对象,本小节我们讲解一下requests的重定向与请求历史。 重定向的定义: 重定向(Redirect)就是通过各种方法将各种网络请求重新定个方…

STM32 TIM输入捕获测频率占空比库函数

目录 一、输入捕获初始化函数 TIM_ICInit TIM_PWMIConfig TIM_ICStructInit 二、主从触发模式对应函数 TIM_SelectInputTrigger TIM_SelectOutputTrigger TIM_SelectSlaveMode 三、配置分频器函数 TIM_SetIC1Prescaler TIM_SetIC2Prescaler TIM_SetIC3Prescaler T…

浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用

摘要:本文分析了木材加工企业的特点、现状及常见电气火灾隐患,提出了消灭电气火灾隐患的措施。结尾介绍了木材加工企业常用电气设备的选用及电气火灾监控系统在其低压配电系统的应用方案及产品选型。 关键词:木材加工企业;电气火…

kafka的安装,用于数据库同步数据

1.0 背景调研 因业务需求,需要查询其他部门的数据库数据,不方便直连数据库,所以要定时将他们的数据同步到我们的环境中,技术选型选中了kafkaCDC Kafka是Apache旗下的一款分布式流媒体平台,Kafka是一种高吞吐量、持久…

微服务—RabbitMQ高级(延迟消息)

本博客为个人学习笔记,学习网站:2023黑马程序员RabbitMQ入门到实战教程 高级篇章节 目录 延迟消息 死信交换机 延迟消息插件 下载安装 延迟交换机声明 ​编辑 发送延迟消息 订单状态同步问题 延迟消息 在电商的支付业务中,对于一些库…

基于springboot学生就业管理系统源码和论文

随着信息化时代的到来,管理系统都趋向于智能化、系统化,学生就业管理系统也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而…

word中插入代码

可以先把代码在highlightcode 中格式化后复制插入 highlightcode地址:https://highlightcode.com/ 复制到word后效果,可以看到美观多了 原始效果

Java面试题:volatile专题

王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第4篇文章,我们一起来看看面试中会问到哪些关于volatile的问题吧。数据来源: 大部分来自于各机构(Java之父,Java继父,某灵,某泡,某客)以及各博主整理文档…

基于uniapp微信小程序的汽车租赁预约系统

随着现代汽车租赁管理的快速发展,可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统,传统的汽车租赁管理已经无法适应高速发展,…

leetcode面试题 02.07. 链表相交

leetcode面试题 02.07. 链表相交 题目 思路 方案一:使用哈希表储存一个链表节点,在另一个链表进行查询是否有相同节点方案二:统计两个链表长度,然后末尾对齐,判断是否有相同节点 代码 使用哈希表set # Definition…

新手搭建服装小程序全攻略

随着互联网的快速发展,线上购物已经成为了人们日常生活中不可或缺的一部分。服装作为人们日常消费的重要品类,线上化趋势也日益明显。本文将详细介绍如何从零开始搭建一个服装小程序商城,从入门到精通的捷径,帮助你快速掌握小程序…

compile 未产生 target 目录

Problem 执行compile操作之后未产生对应的target目录 右击Project → Tree Appearance → Show Excluded Files

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用:避免写一大堆的import,比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

C# Winfrom实现的肺炎全国疫情实时信息图

运行结果: using System; using System.Drawing; using System.Text; using NSoup; using NSoup.Nodes; using System.IO; using System.Net; using System.Text.RegularExpressions; using System.Windows.Forms;namespace Pneumonia {public partial class MainFo…