一种SQL执行效率静态分析方法与流程

文档序号:17489414发布日期:2019-04-23 20:18阅读:518来源:国知局

本发明涉及一种代码分析方法,特别涉及一种sql执行效率静态分析方法。



背景技术:

在业务系统的开发中经常会用到大量用于数据库操作的sql语句。这些sql语句的执行效率会在很大程度上影响到系统的性能和稳定性。为了保证软件产品中的sql语句达到期待的设计目标,软件开发和运维团队会采取很多种方法,这些方法大致可以分为2类:一种是动态监控方法,软件产品上线之后,通过监控软件实际运行时生成的sql语句的执行时间,cpu使用率,io效率等,当测定值超过预设的某个阈值就产生报警;另一种是静态分析方法,在软件开发过程中,通过有经验的软件工程师对sql的代码审核,发现sql中潜在的性能问题或者正确性问题,并及时修正。

上述传统方案中,动态监控方法不能做到事先防范,静态分析人力成本较高,需要投入大量的代码审查时间且依赖于工程师的经验和技术水平。

公开号cn107480296a的发明申请提出一种基于sql的数据库性能分析方法和装置,其中,方法包括:从数据库的日志中,提取sql指令,对提取到的sql指令进行分析,得到数据库根据sql指令进行查询的运行信息,根据运行信息进行统计,分别得到多个性能参数。

该对比文件中的分析方法本质上即为统计分析,使用效率及准确度不高。



技术实现要素:

针对现有技术分析的效率及精确性不高的问题,本发明公开了一种sql执行效率静态分析方法,通过设定的规则对sql抽象语法树进行匹配,加快了分析速度,减少了分析时间,提高了分析准确度。

以下是本发明的技术方案。

一种sql执行效率静态分析方法,包括以下步骤:

步骤s01:将sql语法文件输入到javacc及jjtree中,生成sql解析器;

步骤s02:将待测文件输入到sql解析器中处理,生成sql抽象语法树;

步骤s03:建立sql语法规则库,所述规则库内包含若干种自定义语法规则;

步骤s04:使用规则匹配引擎通过sql语法规则库对sql抽象语法树进行匹配处理,标注出有问题的语句;

步骤s05:输出标注的语句及其详细信息。

本发明可以根据自定义的检测分析规则,对工程中的sql语句进行扫描和静态分析,帮助甚至替代工程师进行sql语句的审核,提高开发和运维的效率。

进一步的,所述步骤s02中,处理过程包括筛选出待测文件中的sql语句并将sql语句按对象归类,对归类完成后的sql语句进行抽象化处理,所述对象名用大写字母开头的英文单词表示,所述对象包括select及where。

进一步的,所述抽象化处理包括使用dsl抽象sql语法的组成部分,用多层子对象的形式将组成部分进一步拆分。

进一步的,所述步骤s03中,规则库的自定义语法规则通过dsl语言编写,包括若干种语法正确但执行效率低的语句形式。

进一步的,所述步骤s04中,规则匹配引擎由搜索引擎及规则库生成。

进一步的,所述步骤s04中,匹配处理过程为:将sql抽象语法树中的内容按出现频率排降序,从序列的头部开始将语句的内容与规则库匹配,符合条件的语句保存至集合a,不符合条件的保存至集合b。

进一步的,还设有二次校验:从所述集合b中随机抽取若干语句,对抽取的语句进行校验,如有问题语句则标出。

进一步的,所述二次校验的执行方式为人工校验或通过神经网络训练后校验。

进一步的,所述步骤s05中,详细信息包括语句在待测文件中的位置、语句中的问题部分及语句在待测文件中的出现频率。

进一步的,所述步骤s02至步骤s04在执行时记录总用时。该时间可以直观反映出分析所用时长,其他方式进行更直观比较,有助于针对不同环境选用不同方法。

本发明可以根据自定义的检测分析规则,对工程中的sql语句进行扫描和静态分析,帮助甚至替代工程师进行sql语句的审核,提高开发和运维的效率,减少分析所用时间,提高分析的准确率。

具体实施方式

以下结合具体实施例对本技术方案作进一步阐述。

实施例:一种sql执行效率静态分析方法,包括以下步骤:

步骤s01:将sql语法文件输入到javacc及jjtree中,生成sql解析器;

步骤s02:将待测文件输入到sql解析器中处理,生成sql抽象语法树;

步骤s03:建立sql语法规则库,所述规则库内包含若干种自定义语法规则;

步骤s04:使用规则匹配引擎通过sql语法规则库对sql抽象语法树进行匹配处理,标注出有问题的语句;

步骤s05:输出标注的语句及其详细信息。

本实施例可以根据自定义的检测分析规则,对工程中的sql语句进行扫描和静态分析,帮助甚至替代工程师进行sql语句的审核,提高开发和运维的效率。

本实施例中,所述步骤s02中,处理过程包括筛选出待测文件中的sql语句并将sql语句按对象归类,对归类完成后的sql语句进行抽象化处理,所述对象名用大写字母开头的英文单词表示,所述对象包括select及where。

本实施例中,所述抽象化处理包括使用dsl抽象sql语法的组成部分,用多层子对象的形式将组成部分进一步拆分。

例如本实施例中,表达式对象类expression是一个抽象类,有2个子类:valueexpression(值表达式)booleanexpression(布尔表达式),而valueexpression又有多个子类functioncall(函数调用)columnexpression(字段值)等。这样就可以通过expression选择到所有“值表达式”和“布尔表达式”,通过valueexpression可以只选择到所有functioncall和columnexpression,而不会选择到like,equal等booleanexpression。

本实施例中,所述步骤s03中,规则库的自定义语法规则通过dsl语言编写,包括若干种语法正确但执行效率低的语句形式。举一个实施时的例子,比如:select*fromuserwhereage>20,其中select语句中应该明确指定需要的列,而不用"*"获取所有列,针对这类问题,本实施例使用groovy语言编写检测规则:ast.select.values.find{itinstanceofastarexpression};结合语法树可以知道,ast是一个抽象语法树对象,ast.select则是sql中的一个语法单元,ast.select.values则是select语法单元的一个属性,表示select语句中选择出来的字段列表,这是一个valueexpression的数组,然后对字段列表进行搜索匹配。其中xxx.find方法的作用是找到符合后面花括号内表达式判断为true的内容。此处,itinstanceofastarexpression表示表达式类型为astarexpression,上述这样的一条规则可匹配和发现上述影响执行效率的sql问题。

本实施例中,所述步骤s04中,规则匹配引擎由搜索引擎及规则库生成。

本实施例中,所述步骤s04中,匹配处理过程为:将sql抽象语法树中的内容按出现频率排降序,从序列的头部开始将语句的内容与规则库匹配,符合条件的语句保存至集合a,不符合条件的保存至集合b。

本实施例中,还设有二次校验:从所述集合b中随机抽取若干语句,对抽取的语句进行校验,如有问题语句则标出。

本实施例中,所述二次校验的执行方式为人工校验或通过神经网络训练后校验。

本实施例中,所述步骤s05中,详细信息包括语句在待测文件中的位置、语句中的问题部分及语句在待测文件中的出现频率。

本实施例中,所述步骤s02至步骤s04在执行时记录总用时。该时间可以直观反映出分析所用时长,其他方式进行更直观比较,有助于针对不同环境选用不同方法。经多次比较,本实施例分析所用时间对比完全人工审核所用时间,节省时间大于百分之八十。

本实施例可以根据自定义的检测分析规则,对工程中的sql语句进行扫描和静态分析,帮助甚至替代工程师进行sql语句的审核,提高开发和运维的效率,减少分析所用时间,提高分析的准确率。

应当说明的是,该具体实施例仅用于对技术方案的进一步阐述,不用于限定该技术方案的范围,任何基于此技术方案的修改、等同替换和改进等都应视为在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1