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

news2025/1/17 21:40:08

一、背景介绍

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

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

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

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

相关文章

JavaScript编写一个倒计时

关键js代码 <script>function countdown() {var targetDate new Date("2024-02-20 12:00:00");var currentDate new Date();var timeDiff targetDate.getTime() - currentDate.getTime();var days Math.floor(timeDiff / (1000 * 60 * 60 * 24));var hours…

电商数据API接口 | 节省你的电商数据采集成本

1、将数据采集的整体成本降低55%。在电商API接口负责了整个数据采集流程后&#xff0c;这家电商公司成功节约了维护和开发上的成本。 2、电商爬虫API可以从极复杂的来源中采集数据&#xff0c;确保完整交付。在电商爬虫API的帮助下&#xff0c;该公司现在可以获取完成业务目标所…

threejs 3D标注

import { CSS3DObject } from "three/examples/jsm/renderers/CSS3DRenderer";gltfLoader.load("./model/exhibit2.glb", (gltf) >{let array ["雕像", "中药房", "浸制区", "道地沙盘","动物标本区&quo…

Java的Lock(二)

自旋锁 VS 适应性自旋锁 堵塞或者notify一个Java线程需要操作系统切换CPU状态来完成(详情请参考11408)。这种状态切换需要耗费CPU时间。如果同步代码块种的内容过于简单。状态切换消耗的时间可能比用户代码执行的时间还要长。 在许多场景中,同步资源的锁定时间很短,为了这一…

【C语言】Leetcode 88.合并两个有序数组

一、代码实现 /*** 函数名称&#xff1a;merge* * 功能描述&#xff1a;合并两个已排序的整数数组* * 参数说明&#xff1a;* nums1&#xff1a;第一个整数数组* nums1Size&#xff1a;第一个数组的大小* m&#xff1a;第一个数组中要合并的子数组的起始索引* nums2&a…

MyBatis Plus:自定义typeHandler类型处理器

目录 引言&#xff1a;关于TypeHandler PostGreSQL&#xff1a;JSON数据类型 PostGreSQL数据库驱动&#xff1a;PGobject类 TypeHandler类型处理器 自定义类型处理器 类型处理器实现&#xff1a;PGJsonTypeHandler 注册类型处理器 引言&#xff1a;关于TypeHandler MyBa…

普中51单片机学习(十四)

中断系统 中断的概念 CPU在处理某一事件A时&#xff0c;发生了另一事件B请求CPU迅速去处理&#xff08;中断发生&#xff09;,CPU暂时中断当前的工作&#xff0c;转去处理事件B&#xff08;中断响应和中断服务)&#xff0c;待CPU将事件B处理完毕后&#xff0c;再回到原来事件…

【C语言的小角落】逻辑与逻辑或混合计算

关注小庄 顿顿解馋(≧◡≦) 引言&#xff1a;本篇博客小庄带领小伙伴们解决一个比较角落有时头疼的问题—关于逻辑与和逻辑或结合运算的问题&#xff0c;请放心食用~ 我们先放代码说话 int main() {int x 1;int y 3;int z 4;if(x1 || y && z){;} printf("y …

【医学大模型】Text2MDT :从医学指南中,构建医学决策树

Text2MDT &#xff1a;从医学指南中&#xff0c;构建医学决策树 提出背景Text2MDT 逻辑Text2MDT 实现框架管道化框架端到端框架 效果 提出背景 论文&#xff1a;https://arxiv.org/pdf/2401.02034.pdf 代码&#xff1a;https://github.com/michael-wzhu/text2dt 假设我们有一…

使用Sora部署实时音视频通信应用实战项目

一、项目概述 本项目将构建一个在线教学平台&#xff0c;实现教师与学生之间的实时音视频通信。平台将提供教师上传课件、发起授课邀请&#xff0c;学生加入课堂、实时互动等功能。通过使用Sora&#xff0c;我们将确保音视频通信的稳定、流畅和低延迟。 目录 一、项目概述 二…

并发编程线程安全之同步锁Synchronized

一、原子性定义 原子性的本质是互斥访问&#xff0c;同一时刻只有一个线程对它进行访问操作 二、原子性问题的简述 public class AutomicDemo {int count 0;public static void main(String[] args) throws InterruptedException {AutomicDemo automicDemo new AutomicDem…

洛谷C++简单题小练习day15—计算阶乘小程序(不用循环)

day15--计算阶乘小程序--2.19 习题概述 题目描述 求 n!&#xff0c;也就是 123⋯n。 挑战&#xff1a;尝试不使用循环语句&#xff08;for、while&#xff09;完成这个任务。 输入格式 第一行输入一个正整数 n。 输出格式 输出一个正整数&#xff0c;表示 n! 代码部分 …

MySQL数据库基础(十一):多表查询

文章目录 多表查询 一、交叉连接&#xff08;了解&#xff09; 二、内连接 1、连接查询的介绍 2、内连接查询 3、小结 三、左外连接 1、左连接查询 2、小结 四、右外连接 1、右连接查询 2、小结 多表查询 一、交叉连接&#xff08;了解&#xff09; 它是所有连接…

Elasticsearch:将 IT 智能和业务 KPI 与 AI 连接起来 - 房间里的大象

作者&#xff1a;Fermi Fang 大象寓言的智慧 在信息技术和商业领导力的交叉点&#xff0c;蒙眼人和大象的古老寓言提供了一个富有洞察力的类比。 这个故事起源于印度次大陆&#xff0c;讲述了六个蒙住眼睛的人第一次遇到大象的故事。 每个人触摸大象的不同部位 —— 侧面、象牙…

Leetcode日记 226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

Leetcode日记 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 二叉树简介二叉树分类解题方法制作不易&#xff0c;感谢三连&#xff0c;谢谢啦 二叉树简介 二叉树&#xff08;Binary Tree&#xff09;是一种特殊的树形…

UE蓝图 分支(Branch)节点和源码

系列文章目录 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 文章目录 系列文章目录一、分支节点功能二、分支节点用法三、分支节点使用场景四、分支节点实现过程五、分支节点相关源码 一、分支节点功能 在Unreal Engine&#xff08;UE&#xff09;的蓝图中&#xff0…

leetcode1049:最后一块石头的重量二

解题思路&#xff1a; 把石头堆分割成差不多的两堆&#xff0c;使得两堆差值最小 dp数组的含义&#xff1a; dp[j]:背包容量为j的背包最大重量(价值)为dp[j] dp[j] max(dp[j],dp[j-stones[i]] stones[i]) 初始化&#xff1a;&#xff08;dp数组的大小根据题目进行定义&a…

华为配置旁挂二层组网隧道转发示例

配置旁挂二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 组网需求 AC组…

【总结】linux命令行在个人用户下添加环境变量

一&#xff0c;简介 在工作过程中需要将对应的路径添加到个人用户的环境变量中&#xff0c;本文介绍如何添加&#xff0c;供参考。 二&#xff0c;操作步骤 非常简单&#xff0c;只需要找到对应配置文件&#xff0c;将路径添加进去即可。 2.1 找到配置文件 一般为用户名下…

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

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