openGauss数据库源码解析——慢SQL检测
openGauss 数据库源码解析——慢 SQL 检测
慢 SQL 检测的定义:
基于历史 SQL 语句信息进行模型训练,并用训练好的模型进行 SQL 语句的预测,利用预测结果判断该 SQL 语句是否是潜在的慢 SQL。当发现潜在的慢 SQL 后,开发者便可以进行针对性优化或者风险评估,以防业务上线后发生问题。
慢 SQL 检测的功能:
上线业务预检测:上线一批新业务前,使用 SQL 诊断功能评估此次上线业务的预估执行时长,便于用户参考是否应该修改上线业务。workload 分析:能够对现有 workload 进行分析,将现有 workload 自动分为若干类别,并依次分析此类别 SQL 语句执行代价,以及各个类别之间的相似程度。
首先,明确一下慢 SQL 发现的几个不同阶段,及其对应解决的问题。
阶段 1:对用户输入的一批业务 SQL 语句进行分析,推断 SQL 语句执行时间的快慢,进而可以将评估为慢 SQL 的语句识别出来。
阶段 2:对识别出的潜在慢 SQL 进行根因诊断,判断这些 SQL 语句是因为什么慢,例如比较常见的原因可能是数据量过大、SQL 语句自身过于复杂、容易产生并发的锁冲突、没有创建索引导致全表扫描等等。
阶段 3:对于已经识别出来的慢 SQL 语句的可能问题源,给出针对性的解决方案,譬如可以提示用户进行 SQL 语句的改写、创建索引等。
目前 openGauss 已具备阶段 1 的能力,正在推进阶段 2 能力,同时发布了部分阶段 3 的能力,如索引推荐功能。业内对于上述第一阶段的主要实现方法大部分是通过执行计划进行估计的,第二阶段大多是通过构建故障模式库、通过启发式规则来实现的,有了上述前两个阶段的准备,第三阶段的实现往往是比较独立的。学术界对于第一阶段的研究比较多,第二阶段采用常规的构建故障模式库的方法实现已经能取得比较好的效果了,因此并不是研究的热点,而第三阶段的工作又相对独立,可以单独作为一个领域进行研究。
基于执行计划的 DNN 模型:
功能流程:
该算法是将执行计划中的算子信息输入到深度学习网络中,从而对执行时间进行预测的。对于每个算子,收集左右子树的向量化特征、优化器代价及执行时间,输入与之对应的模型中,预测该算子的向量化特征及执行时间等。上述过程是个自底向上的过程。
例如——Join 操作预测流程
该流程图显示了一个 join 操作的预测流程,其左右子树均为 Scan 算子,将两个 Scan 算子通过对应的模型预测出的向量化特征、执行时间,以及该 join 算子的优化器评估代价作为入参,输出 join 算子模型得到该操作的向量化特征及预测出的执行时间。
上述技术的缺点。
(1) 需要通过已预测算子不断修正模型,预测过程会较慢。
(2) 对环境变化感知差,如数据库参数变化会使得原模型几乎完全失效。
(3) 预测过程依赖待测语句的执行计划,加重了数据库的负荷,对于 OLTP 场景格外不适用。
基于执行计划的 MART(multiple additive regression trees,多重累加回归树)模型,主要包含离线训练模块和在线预测模块。他们的功能如下所示。
离线训练阶段:针对数据库每种类型的算子(如 Table Scan,Merge Join,Sort…),分别训练其对应的模型,用于估算此算子的开销。此外,使用单独的训练阶段,可为不同的算子选择适当的缩放函数。最后,形成带缩放函数的不同的回归树模型。
在线预测阶段:计算出执行计划中所有算子的特征值。然后,使用特征值为算子选择合适的模型,并使用它来估算执行时间。
功能流程:
基于执行计划 MART 模型技术调优技术的缺点。
1.泛用性较差,强依赖训练好的算子模型,遇到例如用户自定义函数的未知语句时,预测效果会较差。
2.缩放函数依赖于先验结果,对于超出范围的特征值效果无法保证。
3.预测过程依赖待测语句的执行计划,加重了数据库的负荷,很难推广到 OLTP 场景中。
慢 SQL 检测采取的策略:
基于 SQL 模板化的流程
基于 SQL 模板化的流程类似于基于执行计划 MART 模型技术调优技术,他的具体流程如下:
1.获取 SQL 流水数据。
2.检测本地是否存在对应实例的历史模板信息,如果存在,则加载该模板信息,如果不存在,则对该模板进行初始化。
3.基于 SQL 数据,提取 SQL 的粗粒度模板信息。粗粒度模板表示将 SQL 中表名、列名和其他敏感信息去除之后的 SQL 语句模板,该模板只保留最基本的 SQL 语句骨架。
4.基于 SQL 数据,提取 SQL 细粒度的模板信息。细粒度模板表示在粗粒度模板信息的基础上保留表名、列名等关键信息的 SQL 语句模板。细粒度模板相对粗粒度模板保留了更多 SQL 语句的信息。
5.执行训练过程时,首先构造 SQL 语句的基于粗粒度模板和细粒度模板信息,例如粗粒度模板 ID、执行平均时间、细模板执行时间序列、执行平均时间和基于滑动窗口计算出的平均执行时间等。最后将上述模板信息进行储存。
6.执行预测过程时,首先导入对应实例的模板信息,如果不存在该模板信息,则直接报错退出;否则继续检测是否存在该 SQL 语句的粗粒度模板信息,如果不存在,则基于模板相似度计算方法在所有粗粒度模板里面寻找最相似的 N 条模板,之后基于 KNN(K 近邻)算法预测出执行时间;如果存在粗粒度模板,则接着检测是否存在近似的细粒度模板,如果不存在,则基于模板相似度计算方法在所有细粒度模板里面寻找最相似的 N 条模板,之后基于 KNN 预测出执行时间;如果存在匹配的细粒度模板,则基于当前模板数据,直接返回对应的执行时间。
实现代码:
基于深度学习的执行流程
1.获取 SQL 流水。
2.在训练过程中,首先判断是否存在历史模型,如果存在,则导入模型进行增量训练;如果不存在历史模型,则首先利用 word2vector 算法对 SQL 语句进行向量化,即图 8-11 中的 SQL embeding 过程。而后创建深度学习模型,将该 SQL 语句向量化的结果作为输入特征。基于训练数据进行训练,并将模型保存到本地。值得一提的是,该深度学习模型的最后一个全连接层网络的输出结果作为该 SQL 语句的特征向量。
3.在预测过程中,首先判断是否存在模型,如果模型不存在,则直接报错退出;如果存在模型,则导入模型,并利用 word2vector 算法将待预测的 SQL 语句进行向量化,并将该向量输入到深度学习网络中,获取该神经网络的最后一个全连接层的输出结果,即为该 SQL 语句的特征向量。最后,利用余弦相似度在样本数据集中进行寻找,找到相似度最高的 SQL 语句,将该结果返回即为该待预测 SQL 语句的预估执行时间。当然,如果是基于最新 SQL 语句执行时间数据集训练出的深度学习模型,则模型的回归预测结果也可以作为预估执行时间。
实现代码:
总体流程代码解析
参考文章:Gauss 松鼠会源码解析
openGauss数据库源码解析——慢SQL检测的更多相关文章
- 源码解析-url状态检测神器ping-url
前言 ping-url是我最近开源的一个小工具,这篇文章也是专门写它设计理念的科普文. 为什么会做这个ping-url开源工具呢? 起因是:本小哥在某天接到一个特殊的需求,要用前端的方式判断任意一个u ...
- 时序数据库 Apache-IoTDB 源码解析之文件格式简介(三)
上一章聊到在车联网或物联网中对数据库的需求,以及 IoTDB 的整体架构,详情请见: 时序数据库 Apache-IoTDB 源码解析之系统架构(二) 打一波广告,欢迎大家访问IoTDB 仓库,求一波 ...
- 时序数据库 Apache-IoTDB 源码解析之文件索引块(五)
上一章聊到 TsFile 的文件组成,以及数据块的详细介绍.详情请见: 时序数据库 Apache-IoTDB 源码解析之文件数据块(四) 打一波广告,欢迎大家访问IoTDB 仓库,求一波 Star. ...
- Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?
Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的? 如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一 ...
- 时序数据库 Apache-IoTDB 源码解析之系统架构(二)
上一章聊到时序数据是什么样,物联网行业中的时序数据的特点:存量数据大.新增数据多(采集频率高.设备量多).详情请见: 时序数据库 Apache-IoTDB 源码解析之前言(一) 打一波广告,欢迎大家访 ...
- Spark SQL源码解析(三)Analysis阶段分析
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Analysis阶段概述 首先 ...
- Spark SQL源码解析(四)Optimization和Physical Planning阶段解析
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...
- Spark SQL源码解析(五)SparkPlan准备和执行阶段
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...
- 时序数据库 Apache-IoTDB 源码解析之元数据索引块(六)
上一章聊到 TsFile 索引块的详细介绍,以及一个查询所经过的步骤.详情请见: 时序数据库 Apache-IoTDB 源码解析之文件索引块(五) 打一波广告,欢迎大家访问 IoTDB 仓库,求一波 ...
- Ocelot简易教程(七)之配置文件数据库存储插件源码解析
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储 ...
随机推荐
- 【Azure 应用服务】如何来检查App Service上证书的完整性以及在实例中如何查找证书是否存在呢?
问题描述 1:如何来检查App Service上证书的完整性呢? 2:如何来检查App Service的实例上是否包含这个证书呢? Windows 环境 or Linux 环境? 问题解答 问题一: ...
- 【Azure 环境】 介绍两种常规的方法来监视Window系统的CPU高时的进程信息: Performance Monitor 和 Powershell Get-Counter
问题描述 部署在Azure上的VM资源,偶尔CPU飙高,但是发现的时候已经恢复,无法判断当时High CPU原因. 在Windows系统中,有什么方式能记录CPU被进程占用情况,查找出当时是排名前列的 ...
- 机器学习可解释性--LIME
A Unified Approach to Interpreting Model Predictions trusting a prediction or trusting a model 如果⼀个机 ...
- Android系统瘦身
文件格式: Windows常见的文件系统是FAT16.FAT32,NTFS,在Windows环境提供了分区格式转换工具,可以在DOC环境下 使用 Convert命令(Convert e:/fs:nt ...
- 基于RocketMQ实现分布式事务
背景 在一个微服务架构的项目中,一个业务操作可能涉及到多个服务,这些服务往往是独立部署,构成一个个独立的系统.这种分布式的系统架构往往面临着分布式事务的问题.为了保证系统数据的一致性,我们需要确保这些 ...
- ubuntu添加桌面快捷打开方式
不太喜欢ubuntu开机后空荡荡的桌面,希望可以有些像windows一样的快捷打开方式.看了一些博客,也自己探索了一下,发现了在ubuntu中添加软件自带的桌面快捷打开方式的方法. 在终端 cd /u ...
- gcc makefile 模板
一 基本概况 在做基本的c代码测试的时候,经常会遇到gcc做编译,作为一个工程师,不存点模板,每次都是自己写的话,那不是非常的浪费体力,程序员本来就累了.在这上面浪费不少时间,吃力不讨好啊. 保存一些 ...
- JavaScript利用反射实现方法注入
1. 引言 反射是一种能够在程序运行时动态访问.修改某个类(对象)中属性和方法的机制 JavaScript在ES6中提供了Reflect 这一个内置的对象,它提供拦截 JavaScript 操作的方法 ...
- 记录--前端加载超大图片(100M以上)实现秒开解决方案
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 前端加载超大图片时,一般可以采取以下措施实现加速: 图片压缩:将图片进行压缩可以大幅减小图片的大小,从而缩短加载时间.压缩图片时需要 ...
- 微信小程序中rich-text文本溢出(三个...)
小程序中当rich-text中数据较多时就会出现溢出的现象 如下 此时的页面效果并不是很理想 我们可以在数据中给个div <div style="overflow: hidden;wh ...