GaussDB之SQL Audit,面向应用开发的SQL审核工具

news2025/6/17 11:55:45

前言

我们先从一个SQL语句说起(以某传统单机数据库为例)。

1.png

也许这就是我们业务代码中潜藏的一个SQL语句,对于一个普通开发者来说,这个语句编写工整,逻辑清晰,没有什么问题,可以直接推到代码仓中交付上线。但是一个有经验的开发者或数据库管理员可能会发现这个SQL存在诸多的优化点:

  1. 两张表的id字段是否有索引?
  2. like语句不符合最左匹配原则,能否改写?
  3. test_1表where条件中的create_time判断不符合单边原则,无法走索引,可以改写;
  4. union会对结果集去除,效率较低,能否换成union all?
  5. test_2表的id字段被函数引用,也可能用不上索引,可以优化;
  6. test_2表是否存在id和name联合索引,能否加hint,指定特定索引提高查询性能?

貌似经过上述的分析后,这个SQL可以焕然一新,在该数据库上飞一样地跑起来,但这就完了吗?其实并没有,在单机数据库上也许已经优化到了极致,可当我们的数据库是一个分布式数据库呢?它可能又会带来新的性能问题,我们要考虑where条件中的id是否是分布键,concat函数是否会影响算子的下推…...这一系列的问题都会产生。

这实际就是我们所面临的现状,开发者的技术能力良莠不齐,DBA对数据库知识的局限性导致烂SQL无处不在,而且随着数据库的不断变更或演进,一些好的SQL也可能逐步变成需要优化的烂SQL, 我们要时刻不断地找寻它们的踪迹。

SQL Audit审核工具介绍

华为内部有很多业务部门,对传统单机数据库、MySQL、PostgreSQL等各种数据库都有深度的使用,也一直备受烂SQL的困扰,随着GaussDB在内部业务系统的规模应用,现存SQL在GaussDB中能否高质量运行也面临挑战,于是我们开发了SQL Audit工具,根据公司内部各业务部门多年积累的SQL开发规范和GaussDB数据库的优秀实践,整理出SQL审核规则上百条,对命名规范、表结构/索引设计、SQL性能优化、分布键及算子下推等常见影响SQL质量的问题都可以做深入的分析和审核 ,同时我们又开发了一些插件,直接集成到开发的流水线中,自动从代码仓获取SQL语句,做到一键审核。

SQL审核的核心流程可以分为以下三个阶段:

2.png

  1. SQL获取:即我们能从哪些渠道获取到需要审核的SQL, 获取能力决定了我们能否对开发中的代码做更全面的审核;
  2. SQL语法解析:是针对具体的每一条SQL做语法树的生成和分析;
  3. SQL规则审核:是拆解SQL语句的每一部分,和相关审核规则项逐一做匹配,找出待优化或风险点,最终形成审核报告。

SQL获取

客户通过SQL访问数据库的渠道多种多样,客户端工具、命令行、SQL脚本、应用代码…...

代码开发又可以采用JDBC、ODBC、底层API调用等各种方式,SQL语句既可以直接在代码中拼接,也可以通过配置文件(如:Mybatis),还可以通过ORM框架(如:Hibernate )访问数据库,所以如果想要获取到客户的全部SQL是一件非常困难的事情。

SQL Audit对当前大部分SQL使用场景进行了支持,而且还在持续扩大SQL能获取的范围,力求能够全面地将客户使用的所有SQL全部审核到,下图是当前SQL Audit工具支持的SQL获取范围。

3.png

  • 手动输入

手动输入为客户提供了一个简单、易操作的平台,客户可以随时把自己编写的SQL语句输入到SQL Audit工具中进行审核,根据审核结果直接对语句做调整,同时也可以将一个.sql文件整体上传上来,进行批量的审核。

4.png

  • 源代码

源代码是烂SQL最主要的来源,但因其编程语言多种多样(C/C++/JAVA/GO/PYTHON/SHELL…...),编写方式也千奇百怪,所以很难将每种场景的SQL都获取完整,我们将代码中的SQL分成了三类:

1)源码拼接SQL

5.png

通过拼接的方式生成SQL语句,拼接的过程可能会引入很多变量,这种情况无法获取到完整的SQL,所以通过静态文件提取SQL的方式会有很大缺陷,SQL Audit工具支持对Java代码做语法解析,提取里面的SQL,对于其他语言的代码目前暂不支持。

2)无SQL的ORM框架

例如Hibernate、SQLAlchemy等这些ORM框架无法从代码中获取到SQL语句,SQL Audit工具提供了基于Java二进制改写技术,在JVM运行时动态监听JDBC API,获取SQL语句。

3)配置SQL的ORM

很多业务系统基于Mybatis框架搭建访问数据库的能力,Mybatis通过注解或配置文件的方式编写SQL语句,SQL Audit工具能够对Mybatis的注解和配置文件进行深度解析,提取SQL成功率达99%以上。

  • 数据库对象

数据库表结构、索引、约束的设计以及存储过程、函数等PL/SQL的编写对数据库的性能起决定性作用,SQL Audit工具可以连接到数据库,获取数据库中的全部对象定义, 从设计的规范性(如:命名规范、长度/大小写限制)、合理性(如:索引是否合理)和性能等方面进行考量,给出审核建议。

  • 数据库日志

为了更全面地获取到发生在数据库的SQL语句,从数据库本身的日志层面着手也是一个比较可行的方案,解析数据库的redo、开启数据库审计日志、查询SQL缓存区等方式都能够有效获取到运行SQL,SQL Audit工具也支持通过数据库日志获取SQL语句的能力。

  • 流量抓取

为了解决从源代码中无法获取全部SQL的问题,我们开发了基于流量抓取的SQL审核能力,它能极大提升对SQL获取的完整度。IP+端口作为数据库对外的统一入口,基本可以包含客户业务和运维所产生的全部SQL语句,通过对数据库服务器端口的旁路监听,获取到网络协议包,经过对数据库网络协议解析和重复SQL过滤,得到有效的SQL语句,最后将这些SQL传入SQL Audit工具进行审核。

6.png

SQL解析

SQL解析的过程就是将SQL语句按照语法规则解析成语法树的过程,一般的解析过程分为词法解析和语法解析,然后生成语法树,大部分对SQL语句分析的工具都是直接遍历语法树实现的,SQL Audit工具没有直接解析语法树,而是增加了一个处理过程,将语法树解析成Java描述类,后面所有的审核规则都是基于这个语法描述类进行,这样大大提高对审核规则的开发效率,同时降低了开发难度。

7.png

SQL审核

  • 丰富的审核规则

审核的核心是审核规则,而审核规则的核心是对数据库的理解+对客户业务开发理解的实践经验总结,我们结合GaussDB数据库的最佳实践+公司内外部客户的实际使用场景,整理出审核规则数百条,目前产品中已支持规则78条,包含了SQL开发过程中常见的规范和性能问题,后续会有更多的规则持续丰富到产品中。

8.png

SQL Audit同时提供了模板配置功能,客户可以根据自身业务场景灵活地选择需要审核的规则。

  • 深度审核

SQL Audit审核流程如下图所示:

9.png

当一个SQL输入到SQL Audit中后,首先会对SQL进行语法解析,然后根据SQL中所依赖的表、视图等对象,去数据库中获取元数据信息(列信息、索引信息等),如果这个SQL语句的性能可能受执行计划的影响,则会再从数据库中获取该语句的执行计划,综合上述全部信息,逐一匹配每一个相关的规则进行审核,最终输出全部违反规则项。

实践案例

华为云内部某系统有一部分的业务代码是基于JAVA的Mybatis框架开发,在将数据库替换到GaussDB的过程中有大量的SQL做了兼容性改造,为保证改造后的SQL能够高质量地在GaussDB数据库中运行,该系统通过SQL Audit工具对整个代码仓进行全面审核,同时在流水线中部署了SQL Audit审核插件,持续对增量代码进行看护。SQL Audit发现了大量的不规范和低性能的SQL,提前规避了风险SQL流入到生产环境,开发人员根据SQL Audit的审核报告对代码进行了优化,业务切换到GaussDB后持续稳定运行。

以其中一个任务为例,该任务涉及SQL总数有1881个,审核出有问题的SQL有300多个。

审核结果统计报告

10.png

审核问题SQL详情

11.png

总结

GaussDB在打造内核竞争力的同时,希望给客户提供全流程、全链路,面向开发和运维的数据库自动驾驶体验。今年我们发布的SQL自动审核工具,在开发环节帮助客户写好SQL,拒绝烂SQL。

未来,我们还将进一步支持对PL/SQL审核的支持,比如存储过程、函数、触发器、包等的审核,以及与AI大模型的结合,大模型在SQL语言的处理上已经做得很好,SQL Audit工具会和华为的盘古大模型进行对接,通过大模型的能力增强它的审核、优化和改写能力。

作者:华为云数据库和应用迁移专家 李志学

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

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

相关文章

只需要一个技巧,医疗设备立马大变样!

当谈及医疗领域中的设备运行与维护,蓄电池的监控成为至关重要的一环。医疗设备的顺利运行直接关系到患者的生命安全和医疗工作的有效性。为此,对医疗设备所使用的蓄电池进行实时监控和管理显得尤为关键。 蓄电池监控不仅提高了医疗设备的可靠性&#xff…

7个位运算符(二进制运算)(左移右移运算符的使用)

位运算符运算符运算范例<<左移>>右移>>>无符号右移& 与运算 &#xff08;按位与&#xff09; & | 或运算 &#xff08;按位或&#xff09; ^ 异或运算 &#xff08;按位异或&#xff09; ~ 取反运算 &#xff08;按位取反&…

Apache-Maven

安装Maven 解压apache-maven到目录下 Maven目录如下 bin&#xff1a;目录中存放的是可执行文件&#xff0c;JAVA项目中的编译执行打包都要使用bin. conf:存放的是Maven的配置文件&#xff0c;本地配置、私服配置都需要在conf下的settings.xml进行配置。 lib下存放的是Maven所…

高精度、抗干扰强、低功耗:双频四模卫星定位导航GPS/北斗模块SKG123LD参考设计

北斗定位很好理解&#xff0c;就是通过测量出已知位置的卫星导北斗模块之间的距离&#xff0c;再综合多可卫星的数据计算出北斗模块所在位置的经纬度信息。北斗模块和GPS模块一样&#xff0c;北斗模块被称为用户部分&#xff0c;它像“收音机”捕获并跟踪卫星的信号&#xff0c…

TreeSize优化Windows磁盘空间

TreeSize优化Windows磁盘空间 C盘空间爆红下载连接 C盘空间爆红 最近电脑C盘空间爆红&#xff0c;软件卡顿&#xff0c;从网上下载各种厂商软件辅助清理C盘&#xff0c;效果都不理想&#xff0c;要么提示能给你优化几十G的空间&#xff0c;但是一点击执行&#xff0c;哐哐&…

Xcode 基座打包

Xcode基座打包-APP更新版本内容无效 问题&#xff1a;解决&#xff1a; 问题&#xff1a; 使用xcode基座打包之后&#xff0c;上传到appstore进行提审发布。 用户在appstore商城进行更新下载&#xff0c;打开更新后的APP发现版本号是最新的&#xff0c;APP里面的其他内容还是上…

实现简单通信 JAVA

创建服务端与客户端&#xff0c;再利用Java中socket编程传入传出数据 服务端 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class QqMain extends JFrame implements ActionListener{public static void …

CentOS7 安装远程桌面

换源 设置镜像源为清华源&#xff1a; sudo sed -e s|^mirrorlist|#mirrorlist|g \-e s|^#baseurlhttp://mirror.centos.org/centos|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos|g \-i.bak \/etc/yum.repos.d/CentOS-*.repo详见 https://mirrors.tuna.tsinghua.edu.…

【无标题】echarts pieChart legend 图例文字颜色与图例一致

先看成图效果 首先是封装一个公用的函数 const renderPieEcharts (ele: HTMLDivElement,data: Record<string, any>[],color: string[],titleText: string, ) > {const legendData data.map((item, i) > ({name: item.name,textStyle: {color: color[i],},}))co…

【python】python将json字符串导出excel | pandas处理json字符串保存为csv

如何将json转为csv 1、通过json直接转为csv 在Python中&#xff0c;你可以使用pandas库来处理DataFrame&#xff08;数据帧&#xff09;和将JSON数据转换为CSV格式。下面是一个简单的示例代码&#xff0c;展示了如何使用pandas库将JSON数据转换为CSV文件&#xff1a; import p…

前段汇总之JS实现数据双向绑定

参考vue的关键字&#xff1a;v-model绑定值&#xff0c;{{}}&#xff0c;显示值 目录 简单实现双向绑定 使用Proxy优化双向绑定 动态更新值 简单实现双向绑定 新建html5模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta char…

Linux 文件编辑命令

一、三种模式介绍 命令模式 插入模式(编辑模式) 末行模式 二、模式切换 1.命令模式切换到插入模式 &#xff08;1&#xff09; a //进入到当前光标后开始编辑 &#xff08;2&#xff09; A //进入到当前光标所在行的行末开始编辑 &#xff08;3&#xff09;i //进入当前光…

P450进阶款无人机室内定位功能研测

在以往的Prometheus 450&#xff08;P450&#xff09;无人机上&#xff0c;我们搭载的是Intel Realsense T265定位模块&#xff0c;使用USB连接方式挂载到机载计算机allspark上&#xff0c;通过机载上SDK驱动T265运行并输出SLAM信息&#xff0c;以此来实现室内定位功能。 为进…

Grafana+Prometheus技术文档-进阶使用-监控spring-boot项目

阿丹&#xff1a; 之前已经实现了使用Prometheus来对服务器进行了监控和仪表盘的创建&#xff0c;现在就需要对这些监控方法使用在spring-boot中去。 实现思路&#xff1a; 1、集成Actuator 2、加入Prometheus的依赖 3、配置开放端口、以及开放监控 4、配置Prometheus中的配置…

Talk | ICCV‘23清华大学刘世隆:From Detection to Grounding-迈向更强的开集目标检测

本期为TechBeat人工智能社区第521期线上Talk&#xff01; 北京时间8月10日(周四)20:00&#xff0c;清华大学博士生—刘世隆的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “From Detection to Grounding-迈向更强的开集目标检测”&#xff0c;他分…

法规标准-ISO 17386标准解读(2010版)

ISO 17386是做什么的&#xff1f; ISO 17386全名为交通信息和控制系统-低速运行操纵辅助装置(MALSO)性能要求和试验程序&#xff0c;其中主要描述了低速运行操纵辅助装置的功能要求及试验方法 类别 低速运行操纵辅助装置根据其覆盖不同监测范围的能力进行分类。每个监测范围…

使用雅可比行列式方法求Henon映射的lyapunov exponent

雅可比行列式方法 计算Henon映射的Lyapunov exponent图谱,算法描述为: 0:初始化:初始化用到的值。参数a:[0,1.4],b:0.3,初始值x和y:1,迭代次数M:2000。 1:遍历参数a:计算不同a值所对应的Henon映射的Lyapunov exponent图谱。 2:迭代M次: 计算得到Henon映射的…

苍穹外卖系统07

哈喽&#xff01;大家好&#xff0c;我是旷世奇才李先生 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff0c;回复【项目】获取我为大家准备的项目 最近打算把我手里之前做的项目分享给大家&#…

【kubectl详解】

目录 一、陈述式资源管理方法二、基本信息查看1、查看 master 节点状态2、查看命名空间3、查看命名空间的所有资源4、创建命名空间app5、删除命名空间app6、在命名空间kube-public 创建副本控制器&#xff08;deployment&#xff09;来启动Pod&#xff08;nginx-dz&#xff09;…

用MariaDB创建数据库,SQL练习,MarialDB安装和使用

前言&#xff1a;MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。在存储引擎方面&#xff0c;使用XtraDB来代替MySQ…