复杂SQL语句优化解析方法与流程

文档序号:29083124发布日期:2022-03-02 00:36阅读:257来源:国知局
复杂SQL语句优化解析方法与流程
复杂sql语句优化解析方法
技术领域
1.本发明属于计算机数据库技术领域,涉及一种数据库sql语句优化前的语句自动解析方法。


背景技术:

2.由于目前的系统越来越多,在系统上线前进行性能测试时存在较多的数据库索引问题,导致系统请求耗时较长,且大量消耗数据库服务器cpu资源。这时需要数据库开发人员进行大量的时间投入进行数据库索引优化。同时,在系统上线运维一段时间后,由于系统业务数据增加、业务调整等原因,导致系统数据库原有索引失效或索引效率下降,这时也需要数据库管理员投入大量的时间进行数据库索引优化。
3.现有技术专利申请号为“cn201610920693.5”,专利名称为“数据库索引创建方法及装置”的发明专利公开了一种数据库索引创建方法及装置,提供了一种数据库索引创建方法,用以在自动进行数据库索引创建过程中避免业务场景及数据库中无有效数据分布对数据库索引创建的影响。
4.在实际业务中,需要优化的语句大多数都是复杂的sql语句,不是一种简单结构的查询语句;且实际业务中执行的sql语句大部分情况下是相同结构,但查询字段具体值不同而已,在具体优化时,对相同机构的sql语句仅需优化一次,不需要对这类语句进行多次的相同优化。现有技术专利中,对以上问题没有进行较好的解决。
5.为了解决上述问题,本发明发明了一种sql语句的解析方法,它不但可以对复杂的sql进行分解及过滤;同时,还可以对相同结构的sql语句进行过滤。


技术实现要素:

6.为了克服现有技术专利中存在的问题,本发明的目的是提供一种复杂sql语句优化解析的方法,解决现有技术专利中存在的问题,提升sql整体的优化效率。
7.复杂sql语句优化解析方法,包括如下步骤:第一步:设置数据库进行sql抓取的时间段,在sql抓取时间段内自动抓取数据库执行过的sql语句,并记入sql执行列表;第二步:对sql执行列表中的记录按照特征结构去重,对结构相同,参数不同的的语句只保留一条,并记入sql执行结果表;第三步:获取sql执行结果表中第一条sql语句;第四步:按照解析器中的结构特征,解析拆分第一条sql语句,使之按结果集拆分成sql子句,并记入解析临时表记录;第五步:对第四步中的解析临时表中的sql子句进行第三步的迭代解析,直至其不可再次解析,将解析到的sql语句记入解析中间表记录;第六步:顺次获取解析中间表中的一条记录,当该sql语句中结果集、查询字段与条件子句字段均不与待优化sql语句表中已有记录相同时,记入待优化sql语句表。
8.所述步骤二中对包含有子查询、包含有join查询和包含有union查询的复杂sql语句进行解析,分解为仅含有单表select查询,且where子句不包含任何复杂结构的简单结构的sql语句;在简单结构的sql查询语句中,按照所查询单表,对where子句使用相同字段的sql语句进行去重,只保留一条,有效减少需要优化的sql语句数量;对含有子查询的sql查询语句,使用递归方法,从内层逐次递归,将内层的sql语句逐层解析出来,转化为多个简单结构的sql查询语句;对含有join查询的sql查询语句,按照join关键字对该复杂的sql拆分为多个简单结构的sql查询语句;对含有union查询的sql查询语句,按照union关键字对该复杂的sql拆分为多个简单结构的sql查询语句。
9.所述对查询表相同且where子句使用相同字段的sql查询语句,按照返回列表的最小交集去重。
10.本发明的有益效果是:通过本发明能够将需要优化的复杂sql语句解析为简单的sql语句。同时,对简单sql语句中即使用相同查询表又使用相同where子句字段的sql语句进行去重。在提高语句优化分析效率的同时,有效缩减优化范围,从整体上提升优化效率。
附图说明
11.图1是复杂sql语句优化解析技术的内部组件结构图;图2是复杂sql语句优化解析技术的功能流程及产出图。
具体实施方式
12.复杂sql语句优化解析方法,包括如下步骤:第一步:设置数据库进行sql抓取的时间段,在sql抓取时间段内自动抓取数据库执行过的sql语句,并记入sql执行列表;第二步:对sql执行列表中的记录按照特征结构去重,对结构相同,参数不同的的语句只保留一条,并记入sql执行结果表;第三步:获取sql执行结果表中第一条sql语句;第四步:按照解析器中的结构特征,解析拆分第一条sql语句,使之按结果集拆分成sql子句,并记入解析临时表记录;第五步:对第四步中的解析临时表中的sql子句进行第三步的迭代解析,直至其不可再次解析,将解析到的sql语句记入解析中间表记录;第六步:顺次获取解析中间表中的一条记录,当该sql语句中结果集、查询字段与条件子句字段均不与待优化sql语句表中已有记录相同时,记入待优化sql语句表。
13.所述步骤二中对包含有子查询、包含有join查询和包含有union查询的复杂sql语句进行解析,分解为仅含有单表select查询,且where子句不包含任何复杂结构的简单结构的sql语句;在简单结构的sql查询语句中,按照所查询单表,对where子句使用相同字段的sql语句进行去重,只保留一条,有效减少需要优化的sql语句数量;对含有子查询的sql查询语句,使用递归方法,从内层逐次递归,将内层的sql语句逐层解析出来,转化为多个简单结构的sql查询语句;对含有join查询的sql查询语句,按照join关键字对该复杂的sql拆分为多个简单结构的sql查询语句;对含有union查询的sql查询语句,按照union关键字对该复杂的sql拆分为多个简单结构的sql查询语句。
14.所述对查询表相同且where子句使用相同字段的sql查询语句,按照返回列表的最小交集去重。
15.案例一:1.按照查询表和where子句涉及到的字段,对所有最简单结构的sql语句分组;2.获取每一分组中,返回字段的所有集合;3.得到返回字段的所有集合中的最小交集;4.以返回字段的最小交集与where子句中的字段,作为该组简单结构的sql语句的优化依据。
16.案例二:1.对含有子查询的复杂sql语句,将每一个子查询提取出来,看做一个单独的sql查询语句。
17.(1)提取子查询中的sql语句为单独单独一条需要优化的sql语句;(2)若子查询在该主查询中出现前的关键字为in,则提取出该子查询后,该部分取固定值“x”代替;(3)若子查询在该主查询中出现前的关键字为exists或not exists,则直接提取出该子查询后,删除exists或not exists关键字;2.将提取出的子查询sql语句再次解析,直至其成为最简单结构的sql语句;3.合并该复杂sql语句解析出的所有最简单结构的sql语句;4.将修改和替换后转换为最简单结构的sql语句的主查询语句加入到提取出的子查询的语句集合中。
18.案例三:对含有join连接查询的复杂sql语句,以连接查询的关键字为分隔符,将复杂sql语句拆分为多个sql语句;将连接查询中的关联条件涉及到的字段,分别加入到拆分后sql语句的where子句中,且该字段取值用固定值“x”代替;将拆分所得的sql再次解析与拆分,直至转换为最简单结构的sql语句;合并该复杂sql语句解析出的所有最简单结构的sql语句,形成待优化的sql语句集。
19.案例四:1.对含有union联合查询的复杂sql语句,以联合查询的关键字为分隔符,将复杂sql语句拆分为多个sql语句;2.将拆分所得的sql再次解析与拆分,直至转换为最简单结构的sql语句; 3.合并该复杂sql语句解析出的所有最简单结构的sql语句,形成待优化的sql语句集。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1