企业如何做好 SQL 质量管理?

news2024/10/5 20:28:07

研发人员写 SQL 操作数据库想必一定是一类基础且常见的工作内容。如何避免 “问题” SQL 流转到生产环境,保证数据质量?这值得被研发/DBA/运维所重视。

什么是 SQL 问题?

对于研发人员来说,在日常工作中,大部分都需要使用数据库。项目中的很多业务都需要进行增删改查等常见数据库操作,这些数据库操作对应的 SQL 语句主要都是由开发人员编写的。对于 DBA 来说,作为数据库管理和运维人员,DBA 负责数据库的日常运维工作。当出现问题 SQL 时,DBA 通常首当其冲负责问题诊断。

那么,什么是 SQL 问题或者说问题 SQL 呢?从一个更广泛的定义来看,SQL 问题指影响业务正常运行的各种 SQL 相关问题。比如图上举例的案例,它们都可以被归类为 SQL 问题。爱可生作为一家数据库公司,我们从客户那里获得了大量的反馈,每年都会因为 SQL 问题导致几起高级别的生产事故。类似的 SQL 问题导致业务中断的新闻也时不时会出现。

图片

对研发人员来说,这些 SQL 问题在开发阶段很难被发现,因为研发的首要任务是保证需求实现。此外,按我们对研发人群和客户的调研结果显示,研发人员在新功能开发阶段通常没有时间对 SQL 进行优化,往往只要能完成需求交付就已经很不错了。一方面是项目进度压力大,另一方面研发人员自身水平和经验也有高有低。所以研发人员很难对所有的 SQL 全面进行优化。下面我们举一个真实且典型的案例。

一个典型的 SQL 问题案例

图中有三张表,请注意表的字符集的不同,分别是 UTF8 和 UTF8MB4。

图片

我们将三张表两两进行联合查询时,分为字符集一致和不一致两种情况。

图片

当字符集不一致时,从执行计划中可见进行了全表扫描,表关联字段未命中索引。

图片

当每张表有 80 万条测试数据时,执行时间差异明显,字符集不一致的 SQL 执行时间达到了 0.9 秒。随着数据量的增加,该 SQL 的问题会愈加明显,两表联查时表的字符集不匹配会导致查询效率大幅下降。这就是一个典型的 SQL 问题。

可能你会觉得本案例的 SQL 问题看似不该发生,但我们的团队曾多次在客户的生产环境中遇到过类似的情况。但根据大家所掌握的慢 SQL 优化习惯来看,有些引发问题的因素是反直觉的。就本案例也不一定会立刻将问题定位和排查出来。所以,我们需要一种更高效的方式来帮助研发人员解决这类问题。

全方位提高 SQL 质量

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升 SQL 上线效率,提高数据质量。

图片 SQLE 于 2021 年 10 月 24 日这个属于开发者的日子正式开源,至今已经两年多。我们保持每个月发布新版本的频率,不断更新和迭代产品功能。

图片 前面的典型 SQL 问题案例,在 SQLE 中如何解决呢?

图片 根据上图可见,SQLE 会在相同的情况下触发审核规则,快速准确的给出审核结果。

图片 在 SQLE 中有非常丰富的 SQL 规则,上面的案例触发了索引失效类规则中的一条。通过制定一套完善的 SQL 规则规范,是做好 SQL 质量管理的第一步。

做好 SQL 质量管理的第一步

图片

4.1 如何设计 SQL 规范?

在不同的公司和业务场景下,对 SQL 规范都会有不同的要求。想要设计一款通用的 SQL 质量管理平台,对于 SQL 规范的设计要做到按需配置。支持通过规则模板给不同的业务配置不同的规则集。不同的规则集应该有分级匹配机制,以避免触发多条规则产生不同的判断,人为对更严重的问题优先处理整改。在日常工作中也同样允许对特例的 SQL 不进行处理,通过白名单的机制跳过 SQL 审核。

4.2 质量如何量化?

在规则完善后,我们也需要对 SQL 质量处理效果,给人进行量化展示。比如:给 SQL 评分、出《审核报告》和《统计报表》等。一些管理人员并不关心具体的业务,可以通过量化展示,让他们快速了解项目的整体 SQL 质量趋势。

4.3 问题如何优化?

当我们通过规则审核出 SQL 问题并量化之后,就到了整改阶段。

目前,SQLE 提供了修改建议(知识库)和辅助诊断(SQL 分析)来协助 SQL 问题处理。

  • 知识库:每一条规则都会有一篇文档,其中包含了规则涉及的背景知识和规则设置的原理和常见解决方案。
  • SQL 分析:使用者在进行 SQL 优化前,会将 SQL 问题涉及到的数据(表结构、索引使用情况、SQL 执行计划)进行整理,实现辅助诊断。

未来,SQLE 会增加主动优化的功能(SQL 改写、专用大模型能力引入),敬请期待。

SQL 质量管理具体怎么做?

在日常工作中有具体如何将 SQL 质量管理的理念落地呢?让我们先回顾一下软件生命周期。

抛出一些具体差异,每家公司的软件开发流程大体上都如图所示,分为开发、测试、上线、运维等阶段。

站在 SQL 的角度,不同阶段的工作:

  • 设计与实现阶段:开发人员需要完成表结构和业务逻辑 SQL 的设计;
  • 测试阶段:测试人员验证 SQL 的正确性;
  • 部署与发布阶段:运维人员要对库表结构和数据的初始化;
  • 生产与运维阶段:运维人员要对环境中的 SQL 进行监控,遇到问题、诊断问题、解决问题。

图片

通过对各阶段 SQL 流转中各岗位工作内容的分析可知,SQL 问题越早解决成本越低!

我们都希望将问题消灭在萌芽中,但我们也无法保证在不同阶段都没有发生的可能性。所以,需要在不同阶段都准备对应的审核手段。

图片

设计与实现阶段

  • 在开发阶段完成自助审核,尽早发现问题。在本阶段我们前面说过,开发阶段主要任务是完成业务功能的开发,能进行 SQL 审核的是非常优秀的开发人员。在尽量低成本且不改变开发习惯的同时完成完成自助审核为主要需求。
  • SQLE 为开发人员提供了常用的 IDE 插件、SQL 客户端和集成 CI/CD 代码扫描等手段,协助开发人员方便简介地完成自助审核。

测试阶段

  • 测试人员在该阶段已经知道业务运行的具体 SQL,库表结构,可以更直观的进行审核。还可以审核通过网络层抓包或者云平台提供的审计功能来抓取到具体数据。此阶段进行审核相较其他阶段有一定的优势。

部署与发布阶段

  • 该阶段是 SQL 流入生产的一个过程,要实现审核卡点,对上线流程的控制。很多公司有非常规范专业的 SQL 上线流程,由开发和 DBA 来完成流程中的不同任务。

生产与运维阶段

  • 主要是 SQL 上线后的监督工作,如图所示:采集慢日志、TopSQL。及时发现生产环境中的问题。

总结

企业如何做好 SQL 质量管理?

相信大家认真阅读本文,结合自身企业的软件开发流程现状,会对这个问题有一个自己的答案。最后,我们以 SQLE 为例总结如下。在软件生命周期中以 SQL 流转的角度,在四个不同的阶段通过 建立规范、上线前控制、标准发布、前控后督,完成闭环渐进式的 SQL 质量提升。

图片

欢迎大家来体验 SQLE 社区版 :)

✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1699945.html

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

相关文章

全国首例!云南破获域名黑产大案,抓获630人

2021年5月以来,在公安部的组织指挥下,云南公安机关历时8个多月,成功破获全国首例域名黑产犯罪案件,经全国各地公安机关连续奋战,共侦破案件300起,抓获涉案人员630人,查封用于黄、赌、诈等违法网…

K8S认证|CKA题库+答案| 16. 升级集群

目录 16、升级集群 CKA v1.29.0模拟系统 下载试用 题目: 开始操作: 1)、切换集群 2)、 隔离节点 ​3)、登录提权 ​4)、解锁版本 ​5)、查看版本 6)、升级版本 7)、其他…

字符函数和字符串函数(1)<C语言>

前言 在C语言编写程序时&#xff0c;常常需要完成对字符和字符串的处理&#xff0c;为了快捷、方便处理字符和字符串&#xff0c;C语言内置了一些字符函数和字符串函数&#xff0c;所以下文将要介绍一些字符和字符串函数&#xff0c;如&#xff1a;头文件<ctype.h>包含的…

将list对象里的某一个属性取出组成一个新的list

使用Java8将对象里的某一个属性取出组成一个新的list List<Spgg1> listnew ArrayList<>();Spgg1 spgg1new Spgg1();spgg1.setSpdm("测试");spgg1.setGgdm("001");list.add(spgg1);Spgg1 spgg2new Spgg1();spgg2.setSpdm("测试2");sp…

华为Ascend芯片显卡docker环境搭建并完成YOLO8推理

目前随着AI应用的爆发式增长&#xff0c;支持AI模型训练的显卡硬件也变得炙手可热。目前&#xff0c;由于xx颁布了芯片销售禁令&#xff0c;随着而来的是&#xff0c;在国内高端的英伟达显卡买不到了&#xff0c;中低端的显卡价格也水涨船高。在此环境下&#xff0c;华为技术有…

YAML详情

一、kubernetes支持对象 Kubernetes支持YAML和JSON格式管理资源对象 JSON格式&#xff1a;主要用于api接口之间消息的传递YAML格式&#xff1a;用于配置和管理&#xff0c;YAML是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 二、YAML语法格式注意点 …

起保停电路工作原理

一、电路组成 起保停电路由电源保护设备&#xff08;空气开关&#xff09;、交流接触器、启动按钮、停止按钮和用电设备组成。 起保停电路的组成部分通常可分为四个部分&#xff1a; 保护部分&#xff1a;&#xff08;空气开关&#xff09;在电流或电压超出一定范围时自动切断…

web学习笔记(五十八)

目录 1. v-model 双向数据绑定 2. 事件修饰符 3. 路径别名 4. setup语法糖 4.1 语法糖的概念 4.2 setup语法糖 5. 配置代理服务器 1. v-model 双向数据绑定 v-model 双向数据绑定只能使用在表单标签&#xff1b; v-model双向数据绑定原理&#xff1a;采用 Object.de…

Unity3D让BoxCollider根据子物体生成自适应大小

系列文章目录 unity工具 文章目录 系列文章目录unity工具 &#x1f449;前言&#x1f449;一、编辑器添加&#x1f449;二、代码动态添加的方法(第一种)&#x1f449;三、代码动态添加的方法(第二种)&#x1f449;四、重新设置模型的中心点&#x1f449;壁纸分享&#x1f449;…

打卡信奥刷题(21)用Scratch图形化工具信奥P7071 [CSP-J2020] 优秀的拆分

使用2进制进行拆分是比较好的解决方案&#xff0c;毕竟对于大家来说二进制转换是非常熟的&#xff0c;如果不会可以参考打卡信奥刷题&#xff08;19&#xff09;用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 &#xff0c;输出的时候再转换一下输出&#xff0c;…

【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数

本节博客是对阅读剑指offer后的笔记归纳总结&#xff0c;有需要借鉴即可。 目录 1.p21-p25内容概要2.询问语法概念常考&#xff1a;CPP关键字理解举例&#xff1a;sizeof空类 3.分析代码举例&#xff1a;类中拷贝构造的无限递归问题 4.写代码常考点&#xff1a;类内成员函数、迭…

封装了一个iOS水平方向瀑布流布局

首先查看效果图 是支持多分区的 思路就是和竖直方向上的瀑布流布局是一样的&#xff0c; 只不过这里记录的列是水平方向的&#xff0c;同时要记录下 当前最小的x 所在的列&#xff0c;其实原理和竖直方向上的是相同的 &#xff0c;下面贴出代码 父类layout中的代码 // // …

MacOS使用PhpStorm+Xdebug断点调式

基本环境&#xff1a; MacOS m1 PhpStorm 2024.1 PHP7.4.33 Xdebug v3.1.6 1、php.ini 配置 [xdebug] zend_extension "/opt/homebrew/Cellar/php7.4/7.4.33_6/pecl/20190902/xdebug.so" xdebug.idekey "PHPSTORM" xdebug.c…

Java开发大厂面试第26讲:生产环境如何排查问题和优化 JVM?

通过前面几个课时的学习&#xff0c;相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化&#xff0c;这样就会对 JVM 的知识点有一个完整的认识&#xff0c;从而可以更好地应用于实际工作或者面试了。 我们本课时的面试题是&#x…

C++ (week4):Linux系统编程1:文件

文章目录 一、文件&#xff1a;Linux文件操作1.基于文件指针的文件操作2.Linux目录操作(1)目录路径0.error1.getcwd2.chdir3.创建目录&#xff1a;mkdir4.删除目录&#xff1a;rmdir5.unlink(路径名) (2)目录流 DIR*0.模型1.opendir&#xff1a;打开目录流2.closedir&#xff1…

MT3040 矩形覆盖

代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll; const int N 3e5 10; int n, ans, d, w; stack<int> s; // 单调栈 // 如果楼高度类似121&#xff08;凸&#xff0c;两边相等&#xff0c;中间比两边的大&#xff09;&…

【C++】二叉树进阶(二叉搜索树)

目录 一、内容安排说明二、 二叉搜索树2.1 二叉搜索树概念2.2 二叉搜索树操作2.2.1 二叉搜索树的查找2.2.2 二叉搜索树的插入2.2.3 二叉搜索树的删除 2.3 二叉搜索树的代码实现2.3.1 二叉搜索树的节点设置2.3.2 二叉搜索树类的框架2.3.3 二叉搜索树的查找函数2.3.3.1 非递归方式…

如何使用多种算法解决LeetCode第135题——分发糖果问题

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

企业档案管理系统软件都有哪些分类

企业档案管理系统软件可以根据其功能和特点进行分类。以下是一些常见的分类&#xff1a; 1. 全能类档案管理系统&#xff1a;提供文件存储和检索功能&#xff0c;并支持多种文件类型和格式的管理&#xff0c;如文本文件、图像文件、音频文件等。 2. 电子档案管理系统&#xff1…

源码编译安装LAMP(安装apeche mysql php 论坛 网站 巨详细版)

目录 一.LAMP架构相关概述 1.各组件作用 Linux&#xff08;平台&#xff09; Apache&#xff08;前台&#xff09; MySQL&#xff08;后台&#xff09; PHP/Perl/Python&#xff08;中间连接&#xff09; 总结 二.编译安装Apache httpd服务 1.关闭防火墙&#xff0c;将…