当前位置: 首页 > news >正文

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

研发人员写 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

相关文章:

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

研发人员写 SQL 操作数据库想必一定是一类基础且常见的工作内容。如何避免 “问题” SQL 流转到生产环境,保证数据质量?这值得被研发/DBA/运维所重视。 什么是 SQL 问题? 对于研发人员来说,在日常工作中,大部分都需要…...

半年不在csdn写博客,总结一下这半年的学习经历,coderfun的一些碎碎念.

前言 自从自己建站一来,就不在csdn写博客了,但是后来自己的网站因为资金问题不能继续维护下去,所以便放弃了自建博客网站来写博客,等到以后找到稳定,打算满意的工作再来做自己的博客网站。此篇博客用来记录自己在csdn…...

c++中的命名空间与缺省参数

一、命名空间 1、概念:在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或…...

SpringBoot整合WebSocket实现聊天室

1.简单的实现了聊天室功能&#xff0c;注意页面刷新后聊天记录不会保存&#xff0c;后端没有做消息的持久化 2.后端用户的识别只简单使用Session用户的身份 0.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…...

llama-factory学习个人记录

框架、模型、数据集准备 1.llama-factory部署 # 克隆仓库 git clone https://github.com/hiyouga/LLaMA-Factory.git # 创建虚拟环境 conda create --name llama_factory python3.10 # 激活虚拟环境 conda activate llama_factory # 安装依赖 cd LLaMA-Factory pip install -…...

VLC播放器(全称VideoLAN Client)

一、简介 VLC播放器&#xff08;全称VideoLAN Client&#xff09;是一款开源的多媒体播放器&#xff0c;由VideoLAN项目团队开发。它支持多种音视频格式&#xff0c;并能够在多种操作系统上运行&#xff0c;如Windows、Mac OS X、Linux、Android和iOS等。VLC播放器具备播放文件…...

跟小伙伴们说一下

因为很忙&#xff0c;有一段时间没有更新了&#xff0c;这次先把菜鸟教程停更一下&#xff0c;因为自己要查缺补漏一些细节问题&#xff0c;而且为了方便大家0基础也想学C语言&#xff0c;这里打算给大家开一个免费专栏&#xff0c;这里大家就可以好好学习啦&#xff0c;哪怕0基…...

学 C/C++ 具体能干什么?

学习 C 和 C 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;这两种语言以其高性能和低级控制而闻名&#xff0c;特别适合以下几个领域&#xff1a; 1. 系统编程 C 和 C 是系统编程的首选语言&#xff0c;适用于操作系统、驱动程序和嵌入式系统开发。 操作系统开发…...

Django之Ajax实战笔记--城市级联操作

1. 项目架构搭建 1.1 创建项目tpdemo,创建应用myapp # 创建项目框架tpdemo$ django-admin startproject tpdemo$ cd tpdemo# 在项目中创建一个myapp应用$ python manage.py startapp myapp# 创建模板目录$ mkdir templates$ mkdir templates/myapp$ cd ..$ tree tpdemotpdemo…...

基于Netty实现WebSocket服务端

本文基于Netty实现WebSocket服务端&#xff0c;实现和客户端的交互通信&#xff0c;客户端基于JavaScript实现。 在【WebSocket简介-CSDN博客】中&#xff0c;我们知道WebSocket是基于Http协议的升级&#xff0c;而Netty提供了Http和WebSocket Frame的编解码器和Handler&#…...

27【Aseprite 作图】盆栽——拆解

1 橘子画法拆解 (1)浅色3 1 0;深色0 2 3 就可以构成一个橘子 (2)浅色 2 1;深色1 0 (小个橘子) (3)浅色 2 1 0;深色1 2 3 2 树根部分 (1)底部画一条横线 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…...

【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目

项目介绍 【开源】项目基于pythonpandasflaskmysql等技术实现豆瓣电影数据获取及可视化分析展示&#xff0c;觉得有用的朋友可以来个一键三连&#xff0c;感谢&#xff01;&#xff01;&#xff01; 项目演示 【开源】2024最新python豆瓣电影数据爬虫可视化分析项目 项目截图…...

[JDK工具-5] jinfo jvm配置信息工具

文章目录 1. 介绍2. 打印所有的jvm标志信息 jinfo -flags pid3. 打印指定的jvm参数信息 jinfo -flag InitialHeapSize pid4. 启用或者禁用指定的jvm参数 jinfo -flags [|-]HeapDumpOnOutOfMemoryError pid5. 打印系统参数信息 jinfo -sysprops pid6. 打印以上所有配置信息 jinf…...

【Linux系统编程】进程概念、进程排队、进程标识符、进程状态

目录 什么是进程&#xff1f; 浅谈进程排队 简述进程属性 进程属性之进程标识符 进程操作之进程创建 初识fork fork返回值 原理角度理解fork fork的应用 进程属性之进程状态 再谈进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux下的进程状态 “R”(运行状…...

Java与GO语言对比分析

你是不是总听到go与java种种对比&#xff0c;其中在高并发的服务器端应用场景会有人推荐你使用go而不是 java。 那我们就从两者运行原理和基本并发设计来对比分析&#xff0c;看看到底怎么回事。 运行原理对比 java java 中 jdk 已经帮我们屏蔽操作系统区别。 只要我们下载并…...

Linux文件系统原理

Linux文件系统 冯诺依曼在1945年提出计算机的五大组成部分 运算器&#xff1a;CPU 控制器&#xff1a;CPU 存储器&#xff1a;内存和硬盘 输入设备&#xff1a;鼠标、硬盘 输出设备&#xff1a;显示器一、硬盘结构 机械硬盘结构 扇区&#xff1a;硬盘的最小存储单位&#xff…...

初识Spring Cache:如何简化你的缓存处理?

文章目录 1、Spring Cache介绍2、 常用注解3、 使用案例 1、Spring Cache介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的…...

攻防世界[GoodRe]

攻防世界[GoodRe] 学到知识&#xff1a; 逆向的精髓&#xff1a;三分懂&#xff0c;七分蒙。TEA 算法快速识别&#xff08;蒙&#xff09;&#xff1a; 数据处理的形式&#xff1a;进入加密时的数据和加密结束后的数据&#xff0c;处理时数据的分组等等&#xff0c;都能用来…...

IntelliJ IDEA实用插件:轻松生成时序图和类图

IntelliJ IDEA生成时序图、类图 一、SequenceDiagram1.1 插件安装1.2 插件设置1.3 生成时序图 二、PlantUML Integration2.1 插件安装2.2 插件设置2.3 生成类图 在软件建模课程的学习中&#xff0c;大家学习过多种图形表示方法&#xff0c;这些图形主要用于软件产品设计。在传统…...

SpringBoot + Mybatis-Plus中乐观锁实现

悲观锁 悲观锁是一种悲观思想&#xff0c;它认为数据很可能会被别人所修改 所以总会对数据进行上锁&#xff0c;读操作和写操作都会上锁&#xff0c;性能较低&#xff0c;使用较少&#xff01; 乐观锁 乐观锁是一种乐观思想&#xff0c;它认为数据并不一定会被别人所修改 所以…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...