基于数据库的重复关联检测方法、装置、设备及存储介质与流程

文档序号:20164277发布日期:2020-03-24 21:19阅读:255来源:国知局
本发明涉及大数据
技术领域
:,尤其涉及基于数据库的重复关联检测方法、装置、设备及存储介质。
背景技术
::随着互联网的快速发展,计算机设备处理的数据越来越多,数据库得到广泛应用。在数据库系统中,经常需要进行多维数据分析,而数据来源往往是关系型数据库中的多个表,所以经常要进行多表关联,而结构化查询语言(structuredquerylanguage,sql)中的多表连接(join)是一种比较消耗资源的操作,因为该操作涉及到网络输入(input)/输出(output)及全表扫描。由于在大型的数据库系统中,不同的数据处理脚本往往由不同的开发人员开发,开发出来的大量脚本中,可能存在一些重复进行的多表关联的sql语句。因此,对于常用的一些表,需要进行提前关联,然后让后续的sql脚本都使用已关联好的中间表,以减少资源的重复消耗。传统的数据仓库中间宽表的创建,一般需要数据分析人员根据个人经验,或者对已有的大量的sql脚本进行人工的统计检测,找出哪些表是可以重复关联的,这样的人工分析统计,在脚本比较多的情况下,检测效率低且花费的时间较长,而且还可能遗漏部分脚本。技术实现要素:本发明提供了基于数据库的重复关联检测方法、装置、设备及存储介质,用于通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,提高了检测效率。本发明实施例的第一方面提供一种基于数据库的重复关联检测方法,包括:搜索数据库的代码库,所述代码库中包括所有结构化查询语言sql脚本;对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落;对所述多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句;将所述多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名;根据所述至少一对两两关联的源表表名对所述数据库的脚本目录进行标注,生成标注后的脚本目录;根据所述标注后的脚本目录在所有预置的sql脚本中对所述两两关联的源表表名进行重复关联检测,并得到检测结果。可选的,在本发明实施例第一方面的第一种实现方式中,所述对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落包括:确定目标sql脚本;根据预置行数在所述目标sql脚本中查询多个预置sql关键字,所述预置行数用于指示所述目标sql脚本中需要进行检索的代码行数;当所述预置行数中包含所述预置sql关键字时,生成多个sql段落,每个sql段落至少包括一个预置sql关键字。可选的,在本发明实施例第一方面的第二种实现方式中,所述对所述多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句包括:确定多个sql段落中每个sql段落的sql关键字部分和非sql关键字部分;确定每个sql段落中对应的多个待选择分号;在所述对应的多个待选择分号中剔除非法分号,所述非法分号为对应的sql脚本中非sql关键字部分中的分号,得到每个sql段落对应的多个目标分号;按照所述每个sql段落对应的多个目标分号将对应的sql段落进行分割,生成多个处理后的sql语句,所述多个处理后的sql语句包括每个sql段落的处理后的sql语句。可选的,在本发明实施例第一方面的第三种实现方式中,所述将所述多个处理后的sql语句输入到预置软件中进行分析,生成至少一对关联的源表表名包括:将多个处理后的sql语句输入到预置软件中,生成抽象语法树;遍历所述抽象语法树,生成多个查询块;遍历所述查询块,并判断每个查询块中是否包含连接节点;若所述多个查询块中包含连接节点,则提取连接节点中使用的源表表名;根据所述源表表名生成分析结果,所述分析结果包括至少一对关联的源表表名。可选的,在本发明实施例第一方面的第四种实现方式中,所述将多个处理后的sql语句输入到预置软件中,生成抽象语法树包括:将多个处理后的sql语句中关键词统一设置为大写格式或小写格式;通过预置软件对统一格式后的sql语句进行语法解析,得到解析后的代码;基于预置规则在所述解析后的代码中加入特殊词,所述特殊词用于指示特定语法;生成抽象语法树。可选的,在本发明实施例第一方面的第五种实现方式中,所述根据所述标注后的脚本目录在所有预置的sql脚本中对所述两两关联的源表表名进行重复关联检测,并得到检测结果包括:根据所述标注后的脚本目录确定脚本检测顺序;基于所述脚本检测顺序确定第一目标脚本中两两关联的源表表名,并确定第一目标脚本中两两关联的源表表名的对数,所述第一目标脚本为所述脚本检测顺序中排序第一的脚本;基于所述脚本检测顺序遍历其他脚本,得到检测结果,所述检测结果包括所有预置的sql脚本中两两关联的源表表名以及两两关联的源表表名的对数。可选的,在本发明实施例第一方面的第六种实现方式中,所述根据所述标注后的脚本目录在所有预置的sql脚本中对所述两两关联的源表表名进行重复关联检测,并得到检测结果之后,所述方法还包括:根据所述检测结果确定每个关联的源表表名的关联次数;根据所述每个关联的源表表名的关联次数按照从大到小进行排序,得到关联顺序表;调用预置中间表对目标源表表名对进行替换,所述目标源表表名为所述关联顺序表中排序靠前的预置数目个源表表名。本发明实施例的第二方面提供了一种基于数据库的重复关联检测装置,包括:搜索单元,用于搜索数据库的代码库,所述代码库中包括所有结构化查询语言sql脚本;解析单元,用于对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落;预处理单元,用于对所述多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句;分析单元,用于将所述多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名;标注单元,用于根据所述至少一对两两关联的源表表名对所述数据库的脚本目录进行标注,生成标注后的脚本目录;检测单元,用于根据所述标注后的脚本目录在所有预置的sql脚本中对所述两两关联的源表表名进行重复关联检测,并得到检测结果。可选的,在本发明实施例第二方面的第一种实现方式中,解析单元具体用于:确定目标sql脚本;根据预置行数在所述目标sql脚本中查询多个预置sql关键字,所述预置行数用于指示所述目标sql脚本中需要进行检索的代码行数;当所述预置行数中包含所述预置sql关键字时,生成多个sql段落,每个sql段落至少包括一个预置sql关键字。可选的,在本发明实施例第二方面的第二种实现方式中,预处理单元具体用于:确定多个sql段落中每个sql段落的sql关键字部分和非sql关键字部分;确定每个sql段落中对应的多个待选择分号;在所述对应的多个待选择分号中剔除非法分号,所述非法分号为对应的sql脚本中非sql关键字部分中的分号,得到每个sql段落对应的多个目标分号;按照所述每个sql段落对应的多个目标分号将对应的sql段落进行分割,生成多个处理后的sql语句,所述多个处理后的sql语句包括每个sql段落的处理后的sql语句。可选的,在本发明实施例第二方面的第三种实现方式中,分析单元包括:第一生成模块,用于将多个处理后的sql语句输入到预置软件中,生成抽象语法树;第二生成模块,用于遍历所述抽象语法树,生成多个查询块;遍历判断模块,用于遍历所述查询块,并判断每个查询块中是否包含连接节点;提取模块,若所述多个查询块中包含连接节点,则用于提取连接节点中使用的源表表名;第三生成模块,用于根据所述源表表名生成分析结果,所述分析结果包括至少一对关联的源表表名。可选的,在本发明实施例第二方面的第四种实现方式中,第一生成模块具体用于:将多个处理后的sql语句中关键词统一设置为大写格式或小写格式;通过预置软件对统一格式后的sql语句进行语法解析,得到解析后的代码;基于预置规则在所述解析后的代码中加入特殊词,所述特殊词用于指示特定语法;生成抽象语法树。可选的,在本发明实施例第二方面的第五种实现方式中,检测单元具体用于:根据所述标注后的脚本目录确定脚本检测顺序;基于所述脚本检测顺序确定第一目标脚本中两两关联的源表表名,并确定第一目标脚本中两两关联的源表表名的对数,所述第一目标脚本为所述脚本检测顺序中排序第一的脚本;基于所述脚本检测顺序遍历其他脚本,得到检测结果,所述检测结果包括所有预置的sql脚本中两两关联的源表表名以及两两关联的源表表名的对数。可选的,在本发明实施例第二方面的第六种实现方式中,基于数据库的重复关联检测装置还包括:确定单元,用于根据所述检测结果确定每个关联的源表表名的关联次数;排序单元,用于根据所述每个关联的源表表名的关联次数按照从大到小进行排序,得到关联顺序表;替换单元,用于调用预置中间表对目标源表表名对进行替换,所述目标源表表名为所述关联顺序表中排序靠前的预置数目个源表表名。本发明实施例的第三方面提供了一种基于数据库的重复关联检测设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任一实施方式所述的基于数据库的重复关联检测方法。本发明实施例的第四方面提供了一种计算机可读存储介质,包括指令,当所述指令在计算机上运行时,使得计算机执行上述任一实施方式所述的基于数据库的重复关联检测方法的步骤。本发明实施例提供的技术方案中,搜索数据库的代码库,代码库中包括所有结构化查询语言sql脚本;对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落;对多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句;将多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名;根据至少一对两两关联的源表表名对数据库的脚本目录进行标注,生成标注后的脚本目录;根据标注后的脚本目录在所有预置的sql脚本中对两两关联的源表表名进行重复关联检测,并得到检测结果。本发明实施例,通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,提高了检测效率。附图说明图1为本发明实施例中基于数据库的重复关联检测方法的一个实施例示意图;图2为本发明实施例中基于数据库的重复关联检测方法的另一个实施例示意图;图3为本发明实施例中基于数据库的重复关联检测装置的一个实施例示意图;图4为本发明实施例中基于数据库的重复关联检测装置的另一个实施例示意图;图5为本发明实施例中基于数据库的重复关联检测设备的一个实施例示意图。具体实施方式本发明提供了基于数据库的重复关联检测方法、装置、设备及存储介质,用于通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,提高了检测效率。为了使本
技术领域
:的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例进行描述。本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”或“具有”及其任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。请参阅图1,本发明实施例提供的基于数据库的重复关联检测方法的流程图,具体包括:101、搜索数据库的代码库,代码库中包括所有结构化查询语言sql脚本。服务器搜索数据库的代码库,代码库中包括所有结构化查询语言sql脚本。当存在多个数据库时,服务器需要先指定数据库的库名,例如,数据库查询一般需要指定数据库名,例如:select*frommy_database.my_table;如果在执行语句前,先指定默认数据库,例如:usemy_database;那么就可以直接写为:select*frommy_table;会默认使用my_database;所以在解析语句前,需要判断当前的默认数据库是哪个。当存在一个默认数据库时,服务器则搜索默认数据库。可以理解的是,本发明的执行主体可以为基于数据库的重复关联检测装置,还可以是终端或者服务器,具体此处不做限定。本发明实施例以服务器为执行主体为例进行说明。102、对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落。服务器对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落。具体的,服务器确定目标sql脚本;服务器根据预置行数在目标sql脚本中查询多个预置sql关键字,预置行数用于指示目标sql脚本中需要进行检索的代码行数;服务器生成多个sql段落,每个sql段落至少包括一个预置sql关键字。103、对多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句。服务器对多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句。具体的,服务器确定多个sql段落中每个sql段落的sql关键字部分和非sql关键字部分;服务器确定每个sql段落中对应的多个待选择分号;服务器在对应的多个待选择分号中剔除非法分号,非法分号为对应的sql脚本中非sql关键字部分中的分号,得到每个sql段落对应的多个目标分号;服务器按照每个sql段落对应的多个目标分号将对应的sql段落进行分割,生成多个处理后的sql语句,多个处理后的sql语句包括每个sql段落的处理后的sql语句。例如,服务器首先读取整个sql段落的文本内容,由于每一个sql脚本文件里面可能有多段sql段落,所以先用';'对整个语句进行分割,得到每一段sql,并剔除被引号括起来的代表字符串的分号);如果是usedatabase语句,则需要标识为当前的默认数据库。这里就是剔除非sql语句关键字的分号,避免错误的分割语句,例如select“;”frommy_table;select“,”frommy_table;就只会拆成两句。104、将多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名。服务器将多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名。具体的,服务器将多个处理后的sql语句输入到预置软件中,生成抽象语法树(abstractsyntaxtree,ast);服务器遍历抽象语法树,生成多个查询块(queryblock);服务器遍历查询块,并判断每个查询块中是否包含连接(join)节点;若多个查询块中包含连接节点,则服务器提取连接节点中使用的源表表名;服务器根据源表表名生成分析结果,分析结果包括至少一对关联的源表表名。需要说明的是,预置软件需要根据数据库的实现来确定,如果是不同的数据库软件的话,用的可能不一样。例如,hive就是用的“antlr”。antlr是一种语言识别的工具,可以用来构造领域语言。这里不详细介绍antlr,只需要了解使用antlr构造特定的语言只需要编写一个语法文件,定义词法和语法替换规则即可,antlr完成了词法分析、语法分析、语义分析、中间代码生成的过程。其中,服务器将多个处理后的sql语句输入到预置软件中,生成抽象语法树的过程包括:服务器将多个处理后的sql语句中关键词统一设置为大写格式或小写格式;服务器通过预置软件对统一格式后的sql语句进行语法解析,得到解析后的代码;服务器基于预置规则在解析后的代码中加入特殊词,特殊词用于指示特定语法;服务器生成抽象语法树。其中,将内存子查询的from子句展开后,每个表生成一个tok_tabref节点,join条件生成一个“=”节点。其他sql部分类似,不一一详述。例如,当一段sql语句为:selectstatement:selectclausefromclausewhereclause?groupbyclause?havingclause?orderbyclause?clusterbyclause?distributebyclause?sortbyclause?limitclause?对于hivesql中selectstatement的语法规则,selectstatement包含select,from,where,groupby,having,orderby等子句。按照预置规则对代码进行改写,改写后会加入一些特殊词标示特定语法,比如tok_query标示一个查询块,具体代码如下:^(tok_queryfromclause^(tok_insert^(tok_destination^(tok_dirtok_tmp_file))selectclausewhereclause?groupbyclause?havingclause?orderbyclause?clusterbyclause?distributebyclause?sortbyclause?limitclause?))。可以理解的是,由于抽象语法树的结构比较复杂,不方便统计join用到的源表,因此再将抽象语法树生成查询块queryblock,queryblock是一条sql最基本的组成单元,包括三个部分:输入源,计算过程,输出。简单来讲一个queryblock就是一个子查询块,抽象语法树生成子查询块的过程是一个递归的过程,先序遍历ast,遇到不同的树节点(token节点),保存到相应的属性中,使用到的源表在tok_from节点中(这一部分工作,是hive里面的开源代码实现的)。105、根据至少一对两两关联的源表表名对数据库的脚本目录进行标注,生成标注后的脚本目录。服务器根据至少一对两两关联的源表表名对数据库的脚本目录进行标注,生成标注后的脚本目录。需要标记出每个源表表名的脚本路径,输出每一个脚本的路径。例如,关联可能是:源表ajoin源表b,为了统计某两个表一起使用的情况,那么会输出源表a,源表b。也可能是源表ajoin源表bjoin源表c,那么会输出源表a,源表b;源表a,源表c;源表b,源表c。需要说明的是,join类型可以包括多种,例如,innerjoin,leftouterjoin,rightouterjoin,fullouterjoin,semijoin,antijoin,具体此处不做限定。可以理解的是,因为包含的脚本数量很多,例如,同时使用a,b两个表关联的可能有很多个脚本,因此需要通过不同的脚本路径进行标记,例如,标记出脚本路径,输出每一个脚本的路径,然后由开发人员根据路径进行区分和改造。106、根据标注后的脚本目录在所有预置的sql脚本中对两两关联的源表表名进行重复关联检测,并得到检测结果。服务器根据标注后的脚本目录在所有预置的sql脚本中对两两关联的源表表名进行重复关联检测,并得到检测结果。具体的,服务器根据标注后的脚本目录确定脚本检测顺序;服务器基于脚本检测顺序确定第一目标脚本中两两关联的源表表名,并确定第一目标脚本中两两关联的源表表名的对数,第一目标脚本为脚本检测顺序中排序第一的脚本;服务器基于脚本检测顺序遍历其他脚本,得到检测结果,检测结果包括所有预置的sql脚本中两两关联的源表表名以及两两关联的源表表名的对数。本发明实施例,通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,提高了检测效率。请参阅图2,本发明实施例提供的基于数据库的重复关联检测方法的另一个流程图,具体包括:201、搜索数据库的代码库,代码库中包括所有结构化查询语言sql脚本。服务器搜索数据库的代码库,代码库中包括所有结构化查询语言sql脚本。当存在多个数据库时,服务器需要先指定数据库的库名,例如,数据库查询一般需要指定数据库名,例如:select*frommy_database.my_table;如果在执行语句前,先指定默认数据库,例如:usemy_database;那么就可以直接写为:select*frommy_table;会默认使用my_database;所以在解析语句前,需要判断当前的默认数据库是哪个。当存在一个默认数据库时,服务器则搜索默认数据库。可以理解的是,本发明的执行主体可以为基于数据库的重复关联检测装置,还可以是终端或者服务器,具体此处不做限定。本发明实施例以服务器为执行主体为例进行说明。202、对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落。服务器对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落。具体的,服务器确定目标sql脚本;服务器根据预置行数在目标sql脚本中查询多个预置sql关键字,预置行数用于指示目标sql脚本中需要进行检索的代码行数;服务器生成多个sql段落,每个sql段落至少包括一个预置sql关键字。203、对多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句。服务器对多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句。具体的,服务器确定多个sql段落中每个sql段落的sql关键字部分和非sql关键字部分;服务器确定每个sql段落中对应的多个待选择分号;服务器在对应的多个待选择分号中剔除非法分号,非法分号为对应的sql脚本中非sql关键字部分中的分号,得到每个sql段落对应的多个目标分号;服务器按照每个sql段落对应的多个目标分号将对应的sql段落进行分割,生成多个处理后的sql语句,多个处理后的sql语句包括每个sql段落的处理后的sql语句。例如,服务器首先读取整个sql段落的文本内容,由于每一个sql脚本文件里面可能有多段sql段落,所以先用';'对整个语句进行分割,得到每一段sql,并剔除被引号括起来的代表字符串的分号);如果是usedatabase语句,则需要标识为当前的默认数据库。这里就是剔除非sql语句关键字的分号,避免错误的分割语句,例如select“;”frommy_table;select“,”frommy_table;就只会拆成两句。204、将多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名。服务器将多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名。具体的,服务器将多个处理后的sql语句输入到预置软件中,生成抽象语法树(abstractsyntaxtree,ast);服务器遍历抽象语法树,生成多个查询块(queryblock);服务器遍历查询块,并判断每个查询块中是否包含连接(join)节点;若多个查询块中包含连接节点,则服务器提取连接节点中使用的源表表名;服务器根据源表表名生成分析结果,分析结果包括至少一对关联的源表表名。需要说明的是,预置软件需要根据数据库的实现来确定,如果是不同的数据库软件的话,用的可能不一样。例如,hive就是用的“antlr”。antlr是一种语言识别的工具,可以用来构造领域语言。这里不详细介绍antlr,只需要了解使用antlr构造特定的语言只需要编写一个语法文件,定义词法和语法替换规则即可,antlr完成了词法分析、语法分析、语义分析、中间代码生成的过程。其中,服务器将多个处理后的sql语句输入到预置软件中,生成抽象语法树的过程包括:服务器将多个处理后的sql语句中关键词统一设置为大写格式或小写格式;服务器通过预置软件对统一格式后的sql语句进行语法解析,得到解析后的代码;服务器基于预置规则在解析后的代码中加入特殊词,特殊词用于指示特定语法;服务器生成抽象语法树。其中,将内存子查询的from子句展开后,每个表生成一个tok_tabref节点,join条件生成一个“=”节点。其他sql部分类似,不一一详述。例如,当一段sql语句为:selectstatement:selectclausefromclausewhereclause?groupbyclause?havingclause?orderbyclause?clusterbyclause?distributebyclause?sortbyclause?limitclause?对于hivesql中selectstatement的语法规则,selectstatement包含select,from,where,groupby,having,orderby等子句。按照预置规则对代码进行改写,改写后会加入一些特殊词标示特定语法,比如tok_query标示一个查询块,具体代码如下:^(tok_queryfromclause^(tok_insert^(tok_destination^(tok_dirtok_tmp_file))selectclausewhereclause?groupbyclause?havingclause?orderbyclause?clusterbyclause?distributebyclause?sortbyclause?limitclause?))。可以理解的是,由于抽象语法树的结构比较复杂,不方便统计join用到的源表,因此再将抽象语法树生成查询块queryblock,queryblock是一条sql最基本的组成单元,包括三个部分:输入源,计算过程,输出。简单来讲一个queryblock就是一个子查询块,抽象语法树生成子查询块的过程是一个递归的过程,先序遍历ast,遇到不同的树节点(token节点),保存到相应的属性中,使用到的源表在tok_from节点中(这一部分工作,是hive里面的开源代码实现的)。205、根据至少一对两两关联的源表表名对数据库的脚本目录进行标注,生成标注后的脚本目录。服务器根据至少一对两两关联的源表表名对数据库的脚本目录进行标注,生成标注后的脚本目录。需要标记出每个源表表名的脚本路径,输出每一个脚本的路径。例如,关联可能是:源表ajoin源表b,为了统计某两个表一起使用的情况,那么会输出源表a,源表b。也可能是源表ajoin源表bjoin源表c,那么会输出源表a,源表b;源表a,源表c;源表b,源表c。需要说明的是,join类型可以包括多种,例如,innerjoin,leftouterjoin,rightouterjoin,fullouterjoin,semijoin,antijoin,具体此处不做限定。可以理解的是,因为包含的脚本数量很多,例如,同时使用a,b两个表关联的可能有很多个脚本,因此需要通过不同的脚本路径进行标记,例如,标记出脚本路径,输出每一个脚本的路径,然后由开发人员根据路径进行区分和改造。206、根据标注后的脚本目录在所有预置的sql脚本中对两两关联的源表表名进行重复关联检测,并得到检测结果。服务器根据标注后的脚本目录在所有预置的sql脚本中对两两关联的源表表名进行重复关联检测,并得到检测结果。具体的,服务器根据标注后的脚本目录确定脚本检测顺序;服务器基于脚本检测顺序确定第一目标脚本中两两关联的源表表名,并确定第一目标脚本中两两关联的源表表名的对数,第一目标脚本为脚本检测顺序中排序第一的脚本;服务器基于脚本检测顺序遍历其他脚本,得到检测结果,检测结果包括所有预置的sql脚本中两两关联的源表表名以及两两关联的源表表名的对数。207、根据检测结果确定每个关联的源表表名的关联次数。服务器根据检测结果确定每个关联的源表表名的关联次数。例如,出现一对关联的源表表名a和b,则将源表表名a和b的关联次数加1。208、根据每个关联的源表表名的关联次数按照从大到小进行排序,得到关联顺序表。服务器根据每个关联的源表表名的关联次数按照从大到小进行排序,得到关联顺序表。被关联次数最多的源表表名排在第一位,以此类推,得到源表表名的排序。209、调用预置中间表对目标源表表名对进行替换,目标源表表名为关联顺序表中排序靠前的预置数目个源表表名。服务器调用预置中间表对目标源表表名对进行替换,目标源表表名为关联顺序表中排序靠前的预置数目个源表表名。预置中间表为数据库分析人员根据该检测结果,进行设计得到的,使数据库分析人员能够把时间都用于分析中间表的合并方案,减少了大量的人力去人工查看脚本中是否有重复关联,提高了工作效率。本发明实施例,通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,并对重复的关联的源表表名替换成中间表,提高了检测效率和关联效率,进而提升了数据库的运行效率。上面对本发明实施例中基于数据库的重复关联检测方法进行了描述,下面对本发明实施例中基于数据库的重复关联检测装置进行描述,请参阅图3,本发明实施例中基于数据库的重复关联检测装置的一个实施例包括:搜索单元301,用于搜索数据库的代码库,所述代码库中包括所有结构化查询语言sql脚本;解析单元302,用于对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落;预处理单元303,用于对所述多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句;分析单元304,用于将所述多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名;标注单元305,用于根据所述至少一对两两关联的源表表名对所述数据库的脚本目录进行标注,生成标注后的脚本目录;检测单元306,用于根据所述标注后的脚本目录在所有预置的sql脚本中对所述两两关联的源表表名进行重复关联检测,并得到检测结果。本发明实施例,通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,提高了检测效率。请参阅图4,本发明实施例中基于数据库的重复关联检测装置的另一个实施例包括:搜索单元301,用于搜索数据库的代码库,所述代码库中包括所有结构化查询语言sql脚本;解析单元302,用于对每个sql脚本进行解析,得到多个sql段落,每个sql脚本包含至少一个sql段落;预处理单元303,用于对所述多个sql段落进行预处理,生成多个处理后的sql语句,每个sql段落包含至少一个sql语句;分析单元304,用于将所述多个处理后的sql语句输入到预置软件中进行分析,生成至少一对两两关联的源表表名;标注单元305,用于根据所述至少一对两两关联的源表表名对所述数据库的脚本目录进行标注,生成标注后的脚本目录;检测单元306,用于根据所述标注后的脚本目录在所有预置的sql脚本中对所述两两关联的源表表名进行重复关联检测,并得到检测结果。可选的,解析单元302具体用于:确定目标sql脚本;根据预置行数在所述目标sql脚本中查询多个预置sql关键字,所述预置行数用于指示所述目标sql脚本中需要进行检索的代码行数;当所述预置行数中包含所述预置sql关键字时,生成多个sql段落,每个sql段落至少包括一个预置sql关键字。可选的,预处理单元303具体用于:确定多个sql段落中每个sql段落的sql关键字部分和非sql关键字部分;确定每个sql段落中对应的多个待选择分号;在所述对应的多个待选择分号中剔除非法分号,所述非法分号为对应的sql脚本中非sql关键字部分中的分号,得到每个sql段落对应的多个目标分号;按照所述每个sql段落对应的多个目标分号将对应的sql段落进行分割,生成多个处理后的sql语句,所述多个处理后的sql语句包括每个sql段落的处理后的sql语句。可选的,分析单元304包括:第一生成模块3041,用于将多个处理后的sql语句输入到预置软件中,生成抽象语法树;第二生成模块3042,用于遍历所述抽象语法树,生成多个查询块;遍历判断模块3043,用于遍历所述查询块,并判断每个查询块中是否包含连接节点;提取模块3044,若所述多个查询块中包含连接节点,则用于提取连接节点中使用的源表表名;第三生成模块3045,用于根据所述源表表名生成分析结果,所述分析结果包括至少一对关联的源表表名。可选的,第一生成模块3041具体用于:将多个处理后的sql语句中关键词统一设置为大写格式或小写格式;通过预置软件对统一格式后的sql语句进行语法解析,得到解析后的代码;基于预置规则在所述解析后的代码中加入特殊词,所述特殊词用于指示特定语法;生成抽象语法树。可选的,检测单元306具体用于:根据所述标注后的脚本目录确定脚本检测顺序;基于所述脚本检测顺序确定第一目标脚本中两两关联的源表表名,并确定第一目标脚本中两两关联的源表表名的对数,所述第一目标脚本为所述脚本检测顺序中排序第一的脚本;基于所述脚本检测顺序遍历其他脚本,得到检测结果,所述检测结果包括所有预置的sql脚本中两两关联的源表表名以及两两关联的源表表名的对数。可选的,基于数据库的重复关联检测装置还包括:确定单元307,用于根据所述检测结果确定每个关联的源表表名的关联次数;排序单元308,用于根据所述每个关联的源表表名的关联次数按照从大到小进行排序,得到关联顺序表;替换单元309,用于调用预置中间表对目标源表表名对进行替换,所述目标源表表名为所述关联顺序表中排序靠前的预置数目个源表表名。本发明实施例,通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,并对重复的关联的源表表名替换成中间表,提高了检测效率和关联效率,进而提升了数据库的运行效率。上面图3至图4从模块化功能实体的角度对本发明实施例中的基于数据库的重复关联检测装置进行详细描述,下面从硬件处理的角度对本发明实施例中基于数据库的重复关联检测设备进行详细描述。图5是本发明实施例提供的一种基于数据库的重复关联检测设备的结构示意图,该基于数据库的重复关联检测设备500可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessingunits,cpu)501(例如,一个或一个以上处理器)和存储器509,一个或一个以上存储应用程序507或数据506的存储介质508(例如一个或一个以上海量存储设备)。其中,存储器509和存储介质508可以是短暂存储或持久存储。存储在存储介质508的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对基于数据库的重复关联检测设备中的一系列指令操作。更进一步地,处理器501可以设置为与存储介质508通信,在基于数据库的重复关联检测设备500上执行存储介质508中的一系列指令操作。基于数据库的重复关联检测设备500还可以包括一个或一个以上电源502,一个或一个以上有线或无线网络接口503,一个或一个以上输入输出接口504,和/或,一个或一个以上操作系统505,例如windowsserve,macosx,unix,linux,freebsd等等。本领域技术人员可以理解,图5中示出的基于数据库的重复关联检测设备结构并不构成对基于数据库的重复关联检测设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。处理器501可以执行上述实施例中搜索单元301、解析单元302、预处理单元303、分析单元304、标注单元305、检测单元306、确定单元307、排序单元308和替换单元309的功能。下面结合图5对基于数据库的重复关联检测设备的各个构成部件进行具体的介绍:处理器501是基于数据库的重复关联检测设备的控制中心,可以按照设置的基于数据库的重复关联检测方法进行处理。处理器501利用各种接口和线路连接整个基于数据库的重复关联检测设备的各个部分,通过运行或执行存储在存储器509内的软件程序和/或模块,以及调用存储在存储器509内的数据,执行基于数据库的重复关联检测设备的各种功能,通过对结构化查询语言sql脚本中的sql语句进行拆分,统计sql中重复关联的源表,提高了检测效率。存储介质508和存储器509都是存储数据的载体,本发明实施例中,存储介质508可以是指储存容量较小,但速度快的内存储器,而存储器509可以是储存容量大,但储存速度慢的外存储器。存储器509可用于存储软件程序以及模块,处理器501通过运行存储在存储器509的软件程序以及模块,从而执行基于数据库的重复关联检测设备500的各种功能应用以及数据处理。存储器509可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如根据至少一对两两关联的源表表名对数据库的脚本目录进行标注)等;存储数据区可存储根据基于数据库的重复关联检测设备的使用所创建的数据(比如标注后的脚本目录)等。此外,存储器509可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在本发明实施例中提供的基于数据库的重复关联检测方法程序和接收到的数据流存储在存储器中,当需要使用时,处理器501从存储器509中调用。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、双绞线)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,光盘)、或者半导体介质(例如固态硬盘(solidstatedisk,ssd))等。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。另外,在本发明实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1