本发明涉及一种代码分析方法,特别涉及一种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语句的审核,提高开发和运维的效率,减少分析所用时间,提高分析的准确率。
应当说明的是,该具体实施例仅用于对技术方案的进一步阐述,不用于限定该技术方案的范围,任何基于此技术方案的修改、等同替换和改进等都应视为在本发明的保护范围内。