GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具

这篇具有很好参考价值的文章主要介绍了GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自华为云社区《​​GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具》​​,作者:华为云数据库和应用迁移专家。

前言

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

GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具

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

  • 两张表的id字段是否有索引?

  • like语句不符合最左匹配原则,能否改写?

  • test_1表where条件中的create_time判断不符合单边原则,无法走索引,可以改写;

  • union会对结果集去除,效率较低,能否换成union all?

  • test_2表的id字段被函数引用,也可能用不上索引,可以优化;

  • 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审核的核心流程可以分为以下三个阶段:

SQL获取:即我们能从哪些渠道获取到需要审核的SQL, 获取能力决定了我们能否对开发中的代码做更全面的审核;

SQL语法解析:是针对具体的每一条SQL做语法树的生成和分析;

SQL规则审核:是拆解SQL语句的每一部分,和相关审核规则项逐一做匹配,找出待优化或风险点,最终形成审核报告。

SQL获取

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

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

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

  • 手动输入

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

  • 源代码

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

1) 源码拼接SQL

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

2) 无SQL的ORM框架

例如Hibernate、SQLAlchemy等这些ORM框架无法从代码中获取到SQL语句,SQLAudit工具提供了基于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工具进行审核。

SQL解析

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

SQL审核

  • 丰富的审核规则

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

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

  • 深度审核

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

当一个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多个。

审核结果统计报告

审核问题SQL详情

总结

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

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

​点击关注,第一时间了解华为云新鲜技术~​文章来源地址https://www.toymoban.com/news/detail-622322.html

到了这里,关于GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GaussDB技术解读系列:高安全之密态等值

    在第14届中国数据库技术大会(DTCC2023)的GaussDB“五高两易”核心技术,给世界一个更优选择专场,华为GaussDB首席安全架构师郭亮详细解读了GaussDB的高安全之密态等值技术。 本篇为大家分享GaussDB高安全的关键特性,名字叫密态等值,是一个关于全密态的关键能力。   数据成

    2024年02月08日
    浏览(28)
  • GaussDB技术解读系列:5分钟带您了解DRS录制回放

    DRS录制回放是将源数据库发生的真实业务流量,在目标数据库模拟执行,从而观察和检验目标数据库的功能和性能表现。录制回放主要分为录制、回放两个阶段,录制过程是从源数据库上将所需时间段内的全部SQL原语句(包括增、删、改、查)通过审计日志下载、录制代理等

    2024年01月18日
    浏览(28)
  • GaussDB云数据库SQL应用系列—索引管理

    目录 一、前言 二、注意事项 三、索引创建 1、创建普通索引 2、创建唯一索引 3、创建多字段索引 4、创建部分索引 5、创建表达式索引 四、索引管理 1、查看索引信息 2、删除索引 总结 随着互联网的快速发展,数据量呈现爆炸式增长。如何高效地管理和查询这些数据成为了

    2024年02月09日
    浏览(41)
  • GaussDB云数据库SQL应用系列-视图管理

    一、前言 GaussDB是一款基于云计算技术的高性能关系型数据库,支持多种数据模型和分布式架构。在GaussDB中,视图管理是非常重要的一项功能,它可以帮助用户更方便地管理和查询数据。 数据库视图管理是指对数据库中的视图进行创建、修改、删除、查询等操作的过程。 参

    2024年02月06日
    浏览(30)
  • GaussDB云数据库SQL应用系列-定时任务管理

    前言 GaussDB数据库定时任务主要可以用于实现定期的备份、统计信息采集、数据汇总、数据清理与优化等,它是指在指定的时间间隔内自动执行一次或多次SQL语句的程序。 GaussDB数据库兼容Oracle定时任务功能主要通过DBE_TASK高级功能包提供的二次封装接口实现(另可参见GaussD

    2024年02月08日
    浏览(36)
  • GaussDB云数据库SQL应用系列—分区表管理

    目录 前言 一、分区表基本原理 二、分区表主要优势 三、分区表常见场景 四、GaussDB分区表管理(示例) 示例一:创建范围分区表(RANGE) 示例二:创建哈希分区表(HASH) 示例三:创建列表分区(LIST) 五、总结 前言 本文将介绍GaussDB云数据库的分区表技术,包括原理、优势以

    2024年02月09日
    浏览(32)
  • 应用开发平台集成表单设计器系列之1——技术预研与技术选型

    表单的可视化配置,是低代码开发平台的重要组成部分。平台已实现的低代码配置部分,可以配置生成前端vue页面,对于属性较少的实体,如系统基础数据的管理、配置数据的维护,采用标准化的模板模式来生成,配置简便,快速高效。 但不得不说,对于非标准化的复杂表单

    2024年02月05日
    浏览(39)
  • GaussDB数据库SQL系列-行列转换

    一、前言 二、简述 1、行转列概念 2、列转行概念 三、GaussDB数据库的行列转行实验示例 1、行转列示例 1)创建实验表(行存表) 2)静态行转列 3)行转列(结果值:拼接式) 4)动态行转列(拼接SQL式) 2、列转行示例 1)创建实验表(复用前面的测试数据) 2)使用union a

    2024年02月10日
    浏览(30)
  • GaussDB数据库SQL系列-SQL与ETL浅谈

    目录 一、前言 二、SQL与ETL的概述 三、ETL过程中的SQL示例(GaussDB) 1、提取(Extract) 2、转换(Transform) 3、加载(Load) 四、附DataArts Studio介绍 五、小结 在SQL语言中,ETL(抽取、转换和加载)是一种用于将数据从源系统抽取到目标系统的过程。ETL过程通常包括三个阶段:抽

    2024年02月08日
    浏览(37)
  • GaussDB数据库SQL系列-表连接(JOIN)

    目录 一、前言 二、GaussDB JOIN 1、LEFT JOIN 2、LEFT JOIN EXCLUDING INNER JOIN 3、RIGHT JOIN 4、LEFT JOIN EXCLUDING INNER JOIN 5、INNER JOIN 6、FULL OUTER JOIN 7、FULL OUTER JOIN EXCLUDING INNER JOIN 三、GaussDB 实验示例 1、初始化实验表 2、LEFT JOIN(示例) 3、RIGTH JOIN(示例) 4、INNER JOIN(示例) 5、FULL JOIN(示

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包