前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个"TOP SQL"类产品的构想

一个"TOP SQL"类产品的构想

作者头像
用户5548425
发布2019-10-24 20:27:11
6260
发布2019-10-24 20:27:11
举报
文章被收录于专栏:韩锋频道韩锋频道

作为一名DBA,SQL优化是工作中必不可少的部分。如何快速、准确的发现待优化的语句,是DBA经常需要考虑的问题。很多数据库都内置有慢查询、SQL报告等能力,这也是DBA作为SQL优化的通常入口。但在长时间的工作中也发现,系统提供出的SQL并不能全面反映语句运行情况,甚至会误导优化的方向。下文是笔者在数年前萌发的一个产品(暂定名MyTopSQL)想法,很遗憾因各种客观因素未能落地。近期看到多篇AI+DB结合的文章,颇受启发;特分享出此文。本文没有多么高端的算法理论,只是些简单的数理统计,但相信同样能具有不小的价值。如读者感兴趣想尝试实现,可与我沟通。

1. MyTopSQL产品定位

相信DBA们都有这样的经历,当系统出现性能问题时,会收集慢查询报告(或SQL报告),然后尝试优化SQL来解决问题。但从SQL报告中的众多语句中,该选择哪些SQL作为优化对象呢?是否还有有系统遗漏的待优化SQL?SQL的执行特征是否产生变化了呢?想回答上述问题,让我们先看看SQL报告(以下是以Oracle AWR为例)

从上述可以看到,数据库按不同执行特征将语句分类后供DBA来选择:

  • 按执行时间长度
  • 按执行时占用CPU时间
  • 按逻辑读、物理读的次数
  • 按执行次数
  • 按语句解析情况

但这些语句真的是我们应该首选去优化的嘛?其实未必,DBA真正需要优化的,是哪些即将(或已经)产生性能拐点的语句,对于那些”稳态”的语句是不需要过多关注的。此外,还有些语句执行状态非常不稳定(偏差很大),这些也是需要关注的。本产品使用数理统计的一些手段,尝试给出这些SQL;或者说,为DBA提供另一种”视角”去观察SQL。

2. MyTopSQL指标说明

数据特征

  • 统计指标 极值(最大、最小值)、均值、中位数、众数
  • 适用数据 OS.MEM,OS.NET,OS.IO OBJ.INFO(size) SQL.COST,SQL.RESOURCE
  • 典型场景
  1. 中位数,较均值更能反映上述指标,例如SQL时长、各种资源消耗等。
  2. 众数,可反映出最常见的情况,也很有价值。如众数超过一个,则说明数据有明显分类。

数据趋势

  • 统计指标 导数
  • 适用数据 OS.MEM,OS.NET,OS.IO OBJ.INFO(size) SQL.COST,SQL.RESOURCE
  • 典型场景 反映时间序列上数据差异。例如,执行时间导数持续增大,反应了执行恶化程度呈指数增长。

数据离散度

  • 统计指标 分位距、标准差、标准分
  • 适用数据 SQL.COST
  • 典型场景
  1. 分位距,反映了去除噪声后的极值间的差距(最大-最小),可用来反映数据的差异性。传统的四分位距,粒度比较粗,可考虑95%的情况。
  2. 标准差,反映了典型值与均值查询的指标。标准差越小,反映数值离均值越近。
  3. 标准分,反映了相较于均值的位置。正的表示高于均值,负的表示低于均值。数据大小体现了数据与均值的距离。这个将数据形状保持不变,可做跨对象类比,更有意义。

数据概率

前提条件,假设SQL执行时长是符合泊松分布特征的。

  • 统计指标 泊松分布的均值,期望和方差。
  • 适用数据 SQL.TIME
  • 典型场景
  1. 泊松分布期望(λ),该值越大,执行特征越正态;该值越小越偏态。可用该指标进行类别划分。
  2. 泊松均值和方差,反映了执行时长差异化。

数据回归(筛选关联因素)

  • 统计指标 回归系数(最小二乘法)
  • 适用数据 SQL.TIME+XXX
  • 典型场景 计算SQL执行时长与其他指标的回归系数(r),反映出其线性拟合度。如果r=1,为完全线性相关;如r=0,则不存在相关性。SQL受哪类资源的影响最大,可从多个因素中分析其受影响程度。
  1. RESOURCE 评估系统资源影响SQL运行,例如可区分是IO敏感性、CPU敏感性等,用于优化方向的区分。
  2. OBJECT 可评估哪个对象变化(大小、记录数、DML次数等)最影响SQL运行。

3. MyTopSQL架构简图

【其中灰色部分,为自开发部分】

整个系统可分为五个主要部分:

  • 数据源层 系统会支持Oracle、MySQL等数据库。
  • 采集层 采集层功能是完成数据采集工作。主要由collectd、pycollect(暂定名)两个组件,分别完成主机端性能数据收集和数据库端数据收集工作。
  • 存储层 采用InfluxDB时序数据库作为核心存储。
  • 计算层 SQL_AI(暂定名),完成算法计算部分,计算后结果回写到InfluxDB。
  • 展示层 采用Grafana作为统一展示,这部分不要开发工作,但需要大量的配置工作。最好可做成PlugIn的方式。

4. 模块 — 采集部分

内容梳理

采集内容的丰富程度,直接决定了系统的“上限”。我梳理了与SQL相关的采集内容。未来对于采集内容,肯定还是需要后添加的。因此在采集程序设计上,要保留必要的扩展能力,这部分我随后会谈到。

  • OS 收集CPU、MEM、NET、IO等指标。这部分是通过Collectd完成的,其指标可根据需要随时扩展即可。其丰富程度应可以满足我们的需求。
  • DB 收集数据库实例级别的指标,包括BUFFER(缓冲区)、PROFILE(整体性能指标)、LOCK/LATCH(栓锁情况)、EVENT(事件情况)。这部分是需要采集程序采集。
  • OBJ 收集对象级别的指标,包括STAT(统计信息类)、ACTION(动作类,例如DML次数)、INFO(其他信息类,例如表大小)。
  • SQL 收集SQL级别的指标,包括TIME(执行时间类)、COST(成本类)、RESOURCE(资源类)、INFO(其他信息类,例如游标情况)。

采集模块

采集模块,完成了采集多类别(四个类别)、多维度(数十个维度)、多时间间隔(采集频率不同)的信息收集工作。根据数据源不同,其采集方式也不同,我简单梳理了基本采集结构(以MySQL为例)。

  • Thread说明 Main Thread,完成初始化、配置读取、子线程监控、输出日志等功能。 Collect DB Thread,完成DB级别信息收集。Collect Obj Thread,完成OBJ级别信息收集。Collect SQL Thread,完成SQL级别信息收集。
  • Interface说明 公共访问接口,提供对某类服务的访问能力。例如:
  1. 通过SQL访问。例如OBJ级别访问,需要通过访问数据字典完成,调用此公共服务。
  2. 通过MEM访问。例如通过show innodb status完成。DB级收集,调用此公共服务。
  3. 通过日志访问。例如SQL级收集,调用此公共服务。建议先抽象出公共服务部分。

5. 模块 — 计算部分

尚未详细规划,暂定为可配置选择算法,进行计算。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 韩锋频道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档