墨墨导读:2020数据技术嘉年华于11月21日落下帷幕,大会历时两天,来自全国各地的数据领域学术精英、领袖人物、技术专家、从业者和技术爱好者相聚北京,见证了个人的快速成长、技术的迭代进步、行业的蓬勃发展、生态的融合共赢,以及市场的风云变迁。

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

本文根据 巩飞 老师在 2020数据技术嘉年华 分享的主题《大规模多种数据库热点SQL质量分析》整理而成。

巩飞:云和恩墨应用架构产品部总经理,近20年工作经验,围绕数据库领域从事过开发、架构设计、运维等,如今专注产品设计,擅长Oracle数据库、内存数据库、GoldenGate等。经历了两层架构时代关系型数据库技术的蓬勃发展、三层架构时代关系型数据库技术的砥砺前行、一直到现在互联网+时代关系型数据库技术面临的诸多挑战,作为数据领域的老兵,继续奋战在一线,不断学习成长,乐在其中。

摘要

在企业级运维工作中,我们面对的往往是多种数据库,数十甚至数百套数据库,需要在有异动时能快速响应,更需要能提前感知,在问题产生前就找出风险点并消除。在数据库运维中,大多数问题都是由SQL引发的,今天和大家分享的内容就是一种能够同时对数百套Oracle、MySQL、DB2、SQL Server、PostgreSQL、OceanBase数据库抓取TopSQL,分析SQL质量,找出风险点的方法。

为什么要做?

一直以来,大部分数据库性能问题都是由应用开发产生的不良SQL、不良表设计(低效、不规范)所致,并且在测试、开发过程中缺乏有效的审核管理和流程规范,导致SQL问题不能及时有效解决。当应用发布上线以后,爆发各种性能问题和安全问题,DBA陷于各种救火工作。

质量管理的核心思想是提前把事情做对,通过一定的质量管理投入来分析SQL质量,优化问题SQL,将SQL问题消灭在萌芽阶段,避免影响业务高效稳定运行。

做哪些?

既然SQL质量分析是很值得做的事情,那要做哪些?是将所有运行的SQL均进行分析?这样量太大,成本太高。是随机采样SQL进行分析?这样覆盖率有限,很容易错过严重风险。

按照我的经验,想把SQL质控做好,需要合理地分配时间和精力,面面俱到不如重点突破,把80%的资源花在能出关键效益的20%的方面。哪如何确定这20%的重点SQL呢?可以从TopSQL入手。

从执行次数、执行时长、消耗资源等不同维度,提取TopSQL作为分析对象。提取Top 10,Top 20还是Top 50?每小时,每天还是每业务周期提取一次?分析时采用专家模型还是机器学习模型?展示时列表式,报表式,图形式还是告警式?这些都可以随着需求场景,灵活设定。

如何做?

通过采集、分析、展示三大环节,就可以实现大规模多种数据库热点SQL质量分析的目标。

采集:实现按需拿到要分析的SQL。需要包含采集任务管控,按频率调度,合适的采集脚本。

分析:实现对SQL进行全面分析,判断其有无风险,具体的风险情况。需要包含SQL的词法解析,语义识别,提取支撑分析的元数据、统计信息、执行计划等,以专家经验模型,机器学习模型,或二者结合进行风险分析。

展示:以适合的方式将SQL及其风险点,对象信息、统计信息、执行计划进行展示。

1. 关键点是什么?
在整个实现路径中,要做的事情很多,但有三个最为关键的要点,即精准捕获TopSQL,全面深入的分析模型,丰富的信息及知识库。我们对这些深入讨论。

2. Oracle中如何获取TopSQL?
可以从AWR中提取,可以从ASH中提取,也可以从shared pool(v$sql等视图)中提取,还可以通过日志分析提取等,方式较多,考虑实现成本和效果,推荐从AWR中提取。

3. MySQL中如何获取TopSQL?
可以分析慢日志提取,可以分析通用日志提取,也可以从performance schema中提取等,方式较多,考虑实现成本和效果,推荐从performance schema中提取。

4. DB2中如何获取TopSQL?
可以从sysibmadm下的视图中提取,可以从MON_GET系列表函数中提取,也可以通过日志解析提取等,方式较多,考虑实现成本和效果,推荐从sysibmadm下的视图或MON_GET系列表函数中提取。

5. SQL Server中如何获取TopSQL?
可以从dm_exec系列函数中提取,也可以通过日志解析提取等,方式较多,考虑实现成本和效果,推荐从dm_exec系列函数中提取。

6. PostgreSQL中如何获取TopSQL?
可以从pg_stat_statements中提取,也可以通过日志解析提取等,方式较多,考虑实现成本和效果,推荐从pg_stat_statements中提取。

7. OceanBase中如何获取TopSQL?
OceanBase因为目前公开的资料有限,方式较少,已知的可以通过Plan Cache 系列视图中提取。

8. 如何做SQL解析?
在拿到SQL后,首先要进行SQL解析,可以自研,也可以基于开源组件,比如Antlr、JSqlParser、Apache Calcite等二次开发。要达成的目标,都是对各种数据库的SQL进行词法分析、语法分析,生成语法树。

上图为Calcite架构

无论哪种方式,均需兼容Oracle、MySQL、DB2、SQL Server、PostgreSQL、OceanBase等各种数据库的SQL语法区别,增强元数据特征,提取源生执行计划。

这里举个例子,比如SQL语句:

SELECT * FORM  CUSTOMERWHERE
IDCARDNO='320113198001003226'

在经过解析后,生成的语法树是下面的样子。

9. 如何做SQL分析?

在SQL分析时,主流有两种做法,专家经验方式,机器学习方式。

专家经验方式,如上图,主要就是根据专家经验,将SQL可能存在的风险提炼出来,总结出每种风险的特征、危害、检测算法,即规则,最后形成规则库,比如:

规则,是有效经验的浓缩,越丰富可以发现的风险越多。应支持用户自定义规则。

在分析时,主要是用规则库中每个规则算法对SQL进行比对,确定出其风险点。还可以再根据风险点清单给SQL生成质量评分。

机器学习方式,如上图,主要就是通过Agent与环境不断试错的过程的方式进行交互,寻找最优决策策略,以最大化与环境交互获得的累计奖励。在数学上可建模为马尔科夫决策过程(MDP,Markov Decision Process),用于在系统状态具有马尔可夫性质的环境中模拟智能体可实现的随机策略与回报,要素包括状态、动作、策略和奖励。

实际执行时间作为Reward进行训练,即执行策略的调整。目标是找到查询执行时间最小的执行计划。

10. 为何要建立知识库?

如果你长期进行SQL质量分析、SQL优化相关工作,就会发现,SQL虽然可以千奇百怪,写成各种各样,但其底层原理,高效的原则却是相同的。所以建立单位内部SQL相关的知识库,不仅能总结过去,还可以指导未来。在分析出风险SQL后,给不擅长优化的同事提供资源支撑。建议知识库至少涵盖SQL知识背景、SQL优化原则、SQL优化原理、SQL优化示例、SQL编写规范等,并随着业务发展不断积累更新。

11. 怎么样支撑大规模多种数据库的并SQL质量分析?
为了实现大规模多种数据库并行的SQL质量的评估和管控,要做到外部架构松耦合,内部架构高性能、高可用、随需扩展。比如可以考虑整个平台部署架构示意如下:

平台工作区,即大规模多种数据库热点SQL质量分析平台,分为应用层和数据层。应用层由反向应用代理、应用服务、数据缓存组每种组件均无单故障点,并可水平扩展。数据层由数据代理、MySQL主从复制\集群组成,每种组件均无单故障点,并可水平扩展。各个组件的协作图示意如下:

至此,我们的整个方案思路和要点已经介绍完毕,有能力或精力的朋友们,可以尝试落地实践,在SQL质量分析和管控方面更近一步。也可以采用成熟的SQL质量管控平台-SQM。SQM将SQL质控按场景工具化、自动化,和DevOps过程集成起来,可以高效的实现质控目标。


- end -

推荐阅读:144页!分享珍藏已久的数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

视频号,新的分享时代,关注我们,看看有什么新发现?

数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

亡羊补牢or防患未然?在数百套多种数据库中找出风险点(附PPT下载)相关推荐

  1. 【面试现场】如何在10亿数中找出前1000大的数

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已经挂了两家,今天小史去了BAT中的最后一家面试了. 简单的 ...

  2. ACMNO.33 C语言-最大值3 分别用函数和带参的宏,从三个数中找出最大的数。

    题目描述 分别用函数和带参的宏,从三个数中找出最大的数. 输入 3个实数 输出 最大的数,输出两遍,先用函数,再用宏. 保留3位小数. 样例输入 1 2 3 样例输出 3.000 3.000 来源/分 ...

  3. 如何在10亿个整数中找出前1000个最大的数?

    作者:vincent-duan,专注 Java,沉迷开源,架构师社区合伙人! 面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一 ...

  4. 如何在10亿个整数中找出前1000个最大的数(TopN算法)

    面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一次循环找到数组中最大的元素放置在倒数第一个位置,第二次循环找到第二大的元素放置 ...

  5. 分别用函数和带参的宏,从三个数中找出最大的数。

    题目描述 分别用函数和带参的宏,从三个数中找出最大的数. 输入 3个实数 输出 最大的数,输出两遍,先用函数,再用宏. 保留3位小数. 样例输入 1 2 3 样例输出 3.000 3.000 #inc ...

  6. 大数据面试题——如何在大量的数据中找出不重复的数

    问题描述: 在2.5亿个整数中找出不重复的数,注意,内存不足以容纳2.5亿个整数. 分析解读: 方法一:分治法 采用hash的方法,把这2.5亿个数划分到更小的文件中,从而保证每个文件的大小不超过可用 ...

  7. 如何在 10 亿数中找出前 1000 大的数?

    作者 | channingbreeze 责编 | 胡巍巍 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已 ...

  8. 链圈百家,IT词话:BTA 2018先锋资源集锦(另附PPT下载)

    近年随着区块链技术的迅速升温,其技术和应用场景受到了各界人士越来越多的关注,以太坊作为区块链2.0的代表,是第一个通用的区块链平台,自诞生之初便备受瞩目,很多项目受到了以太坊的启发,为了让国内开发者进 ...

  9. 从十亿个数中找出前1000个最大的数的算法

    10亿个数中找出1000个最大的数的算法思路: 1,先拿出前1000个数字,并排序,找出最小值为 minValue .    2,  然后再依次拿出1000个数字,找出最大值为 tempMaxValu ...

最新文章

  1. 淘宝开源代码质量检测工具!
  2. C++对象模型5——类对象的内存布局
  3. leetcode 64. 最小路径和
  4. 实现在tabcontrol里面拖拽tabpage来设置tabpage的位置
  5. html不读取缓存,如何让前端浏览器不进行缓存
  6. Team photo的新api
  7. python 抓取微博评论破亿_一篇文章教会你使用Python定时抓取微博评论
  8. Win32ASM-进程学习【1】
  9. 微信小程序点击跳转出现背景
  10. python里面的dict和set
  11. ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统)
  12. 反射 java 例子 get_Java反射实例
  13. CocoaPods安装和使用图解
  14. CSDN的markdown编辑器详细使用说明、语法快速索引手册
  15. VBA select case
  16. 网站日志分析软件--让网站日志分析工作变得更简单
  17. Thief-Book 上班摸鱼神器
  18. python使用execjs时,编码gdk报错
  19. python股票网格交易法详解_我的选股方法 大家好,我是阿兰,一个将网格交易法应用于股票的人。昨天我给大家介绍了我的网格交易体系,并简单说明了我的选股方法,今天我将... - 雪球...
  20. linux系统连接不上wifi

热门文章

  1. 安卓 dump 工具 影响_工具如何影响文化?
  2. linux 路由器_为什么我要建立自己的自制Linux路由器
  3. (50)常见命名方式
  4. ES5常用的组合继承及原型链理解
  5. JSON语法之JSON字符串
  6. CSS 单词折行 word-wrap属性
  7. CSS 字体调整 font-size-adjust属性
  8. 一.因子图优化学习---董靖博士在深蓝学院的公开课学习(1)
  9. 二.开发记录之派勤工控机远程使用和ubuntu和ROS环境配置
  10. php的验证码要gd库,PHP通过GD库实现验证码功能