作为一名DBA,SQL优化是工作中必不可少的部分。如何快速、准确的发现待优化的语句,是DBA经常需要考虑的问题。很多数据库都内置有慢查询、SQL报告等能力,这也是DBA作为SQL优化的通常入口。但在长时间的工作中也发现,系统提供出的SQL并不能全面反映语句运行情况,甚至会误导优化的方向。下文是笔者在数年前萌发的一个产品(暂定名MyTopSQL)想法,很遗憾因各种客观因素未能落地。近期看到多篇AI+DB结合的文章,颇受启发;特分享出此文。本文没有多么高端的算法理论,只是些简单的数理统计,但相信同样能具有不小的价值。如读者感兴趣想尝试实现,可与我沟通。
1. MyTopSQL产品定位
相信DBA们都有这样的经历,当系统出现性能问题时,会收集慢查询报告(或SQL报告),然后尝试优化SQL来解决问题。但从SQL报告中的众多语句中,该选择哪些SQL作为优化对象呢?是否还有有系统遗漏的待优化SQL?SQL的执行特征是否产生变化了呢?想回答上述问题,让我们先看看SQL报告(以下是以Oracle AWR为例)
从上述可以看到,数据库按不同执行特征将语句分类后供DBA来选择:
但这些语句真的是我们应该首选去优化的嘛?其实未必,DBA真正需要优化的,是哪些即将(或已经)产生性能拐点的语句,对于那些”稳态”的语句是不需要过多关注的。此外,还有些语句执行状态非常不稳定(偏差很大),这些也是需要关注的。本产品使用数理统计的一些手段,尝试给出这些SQL;或者说,为DBA提供另一种”视角”去观察SQL。
2. MyTopSQL指标说明
数据特征
数据趋势
数据离散度
数据概率
前提条件,假设SQL执行时长是符合泊松分布特征的。
数据回归(筛选关联因素)
3. MyTopSQL架构简图
【其中灰色部分,为自开发部分】
整个系统可分为五个主要部分:
4. 模块 — 采集部分
内容梳理
采集内容的丰富程度,直接决定了系统的“上限”。我梳理了与SQL相关的采集内容。未来对于采集内容,肯定还是需要后添加的。因此在采集程序设计上,要保留必要的扩展能力,这部分我随后会谈到。
采集模块
采集模块,完成了采集多类别(四个类别)、多维度(数十个维度)、多时间间隔(采集频率不同)的信息收集工作。根据数据源不同,其采集方式也不同,我简单梳理了基本采集结构(以MySQL为例)。
5. 模块 — 计算部分
尚未详细规划,暂定为可配置选择算法,进行计算。