一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种sql脚本的优化方法及装置与流程

2022-09-03 19:26:33 来源:中国专利 TAG:
1.本发明实施例涉及金融科技(fintech)领域,尤其涉及一种sql脚本的优化方法及装置。
背景技术
::2.随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。对于金融业务系统所涉及的相关业务数据,均是存储在数据库中,其中,针对相应业务数据的相关操作,都是采用连接数据库的方式,编写相应的sql(structuredquerylanguage,结构化查询语言)脚本,根据具体的业务逻辑,对数据库表中的字段进行增删改查。3.然而,相关技术中,为了提升数据库操作的性能,每张表都会针对相关数据库表的指定字段建立索引。其中,在实际的业务中,可能会存在不同的业务逻辑,那么也就会存在不同的sql脚本,因而可能会存在针对不同的条件字段,创建不同的索引信息,这样就会导致一张表可能存在多个索引信息。如此,在执行sql脚本时,数据库引擎会根据sql脚本的条件信息按照一定的策略从sql脚本所关联的数据库表的索引信息中选择索引字段,但是,由于索引选择是数据库执行引擎所决定的,所以在针对sql脚本的相应操作中,业务开发人员是无法感知是否命中多索引的问题,因而会出现误选索引的问题,从而导致sql脚本的执行效率低。4.综上,目前亟需一种sql脚本的优化方法,用以有效地避免出现索引误选的问题,以此有效地sql脚本的执行效率。技术实现要素:5.本发明实施例提供了一种sql脚本的优化方法及装置,用以有效地避免出现索引误选的问题,以此有效地sql脚本的执行效率。6.第一方面,本发明实施例提供了一种sql脚本的优化方法,包括:7.在检测到结构化查询语言sql脚本的执行触发动作时,对sql脚本进行拦截,并通过索引映射库,对拦截到的sql脚本进行识别,确定所述sql脚本是否属于具有多索引信息的脚本;所述索引映射库用于指示各sql脚本的哈希值分别与对应的m个索引信息的映射关系;8.若确定所述sql脚本属于具有多索引信息的脚本,则基于所述sql脚本对应的多个索引信息以及所述多个索引信息包括的各索引字段具有的区分度,确定用于在执行所述sql脚本时所需的第一索引信息;其中,每个索引字段具有的区分度用于表征该索引字段在对应的索引信息所在的数据库表中,该索引字段具有不同业务数据值的数量占比;9.通过基于所述第一索引信息,调整所述sql脚本,生成用于在sql执行引擎中执行的sql脚本。10.上述技术方案中,本发明中的技术方案通过针对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脚本误选索引问题的修复成本。11.可选地,所述通过索引映射库,对拦截到的sql脚本进行识别,确定所述sql脚本是否属于具有多索引信息的脚本,包括:12.确定所述sql脚本的第一哈希值;13.通过所述sql脚本的第一哈希值,从所述索引映射库中匹配出对应的m个索引信息;14.若m个索引信息的数量满足数量阈值,则确定所述sql脚本属于具有多索引信息的脚本;若m个索引信息的数量不满足数量阈值,则确定所述sql脚本不属于具有多索引信息的脚本。15.上述技术方案中,由于索引映射库中预先存储有各sql脚本的哈希值与对应的至少一个索引信息的映射关系,那么通过索引映射库即可及时准确地判断某一即将执行的sql脚本是否会命中多索引,也即是,基于已有的sql脚本信息针对sql脚本进行分析,以此来识别sql脚本是否命中多索引,从而便于后续能够准确地选择出最优的索引信息用于优化sql脚本(即指定sql脚本在运行时使用最优的索引信息)。具体来说,通过某一即将执行的sql脚本的哈希值从索引映射库中匹配出对应的m个索引信息,并判断该m个索引信息的数量是否满足数量阈值,在满足数量阈值时才确定该即将执行的sql脚本命中多索引,否则认为该即将执行的sql脚本未命中多索引,可以直接运行。16.可选地,所述确定所述sql脚本的第一哈希值,包括:17.通过sql参数化模板类函数,将所述sql脚本进行格式化模板提取处理,得到所述sql脚本对应的第一sql模板信息;18.对所述第一sql模板信息进行归一化处理,得到第二sql模板信息;19.对所述第二sql模板信息进行哈希运算,确定所述sql脚本的第一哈希值。20.上述技术方案中,在实际的业务系统表操作过程中,系统的sql业务逻辑基本是不会变化的,变化的仅是逻辑中相关业务参数的实际取值信息,因此在业务开发代码中,都会存在相关的sql模板语句。如此,为了便于提升针对sql脚本的多索引判断效率,所以会针对sql脚本进行归一化处理,将参数取值不同但是业务逻辑相同的多个sql脚本整合成为一个sql模板,然后针对sql模板进行哈希运算来确定sql模板的哈希值,也即是针对参数取值不同但是业务逻辑相同的多个sql脚本所对应的哈希值都是相同的,而且参数取值不同但是业务逻辑相同的多个sql脚本所对应的索引信息也是一样的,也即是在索引映射库中存储一个哈希值以及该哈希值对应的m个索引信息即可,从而可以有效地提升后续针对即将执行的sql脚本是否命中多索引的匹配效率。21.可选地,所述对所述第一sql模板信息进行归一化处理,得到第二sql模板信息,包括:22.若所述第一sql模板信息中存在有大写格式的字母,则将所述大写格式的字母转化为小写格式的字母,从而得到转化后的第一sql模板信息;23.若所述转化后的第一sql模板信息中存在有动态取值信息,则将所述动态取值信息替换为设定的替换值,从而得到所述第二sql模板信息。24.上述技术方案中,为了准确地将参数取值不同但是业务逻辑相同的多个sql脚本整合成为一个sql模板,会针对经过格式化模板提取处理的sql脚本进行归一化处理,也即是,在确定第一sql模板信息中存在有大写格式的字母时,会将大写格式的字母转化为小写格式的字母,以此得到转化后的第一sql模板信息,并在确定转化后的第一sql模板信息中存在动态取值信息时,即可将动态取值信息替换为设定的替换值,以此可以实现sql模板信息的格式统一,从而可以避免在对不同参数取值的sql脚本进行分析时会针对业务执行的效率产生较大的影响。25.可选地,通过下述方式建立所述索引映射库:26.针对任一sql脚本,对所述sql脚本进行分析处理,得到所述sql脚本对应的第三sql模板信息,并对所述第三sql模板信息进行哈希运算,确定所述sql脚本的第二哈希值;27.对所述sql脚本进行分词处理,得到所述sql脚本对应的数据源信息以及条件域信息,并对所述sql脚本对应的数据源信息进行数据库表信息提取处理,得到按序排列的各数据库表信息,对所述sql脚本对应的条件域信息进行解析处理,得到按序排列的各条件字段信息;将所述各数据库表信息与所述按序排列的各条件字段信息进行关联,从而生成数据库表条件字段集合;所述数据库表条件字段集合包括按序排列的各数据库表信息以及每个数据库表信息关联的按序排列的至少一个条件字段信息;28.针对每个数据库表信息,确定所述数据库表信息对应的数据库,并从所述数据库中获取所述数据库表信息具有的按序排列的各索引信息;其中,每个索引信息包括按序排列的至少一个索引字段信息;29.将所述数据库表信息关联的每个条件字段信息与所述数据库表信息具有的按序排列的各索引信息包括的按序排列的至少一个索引字段信息依次进行匹配,并将匹配成功的至少一个索引信息作为用于判断sql脚本是否属于具有多索引信息的脚本的第二索引信息;30.将各sql脚本的第二哈希值以及所述各第二哈希值对应的至少一个第二索引信息存储至所述索引映射库。31.上述技术方案中,为了提升针对即将执行的sql脚本是否存在有多索引信息的识别性能,需要提前针对各sql脚本进行多索引分析,同时需要分析出各sql脚本所关联的索引信息以及所关联的索引字段信息,也即是提前分析各sql脚本中每个sql脚本是否命中多索引,即,确定各sql模板的哈希值,并确定每个sql模板对应的数据库表信息具有的至少一个索引信息,如此即可生成各哈希值与各哈希值对应的至少一个索引信息的映射关系,以便为后续识别即将执行的sql脚本是否存在有多索引信息提供有效地支持。32.可选地,所述基于所述sql脚本对应的多个索引信息以及所述多个索引信息包括的各索引字段具有的区分度,确定用于在执行所述sql脚本时所需的第一索引信息,包括:33.针对所述sql脚本对应的任一索引信息,确定所述索引信息所在的数据库表以及所述索引信息包括的至少一个索引字段;34.针对每个索引字段,确定所述索引字段在所述索引信息所在的数据库表中具有的区分度;35.将所述多个索引信息包括的各索引字段具有的区分度进行比对,确定出最大的区分度,并确定出所述最大的区分度对应的第一索引字段;36.将所述第一索引字段对应的索引信息确定为用于在执行所述sql脚本时所需的第一索引信息。37.上述技术方案中,通过基于各索引字段的实时数据分布情况以及对应的至少一个索引信息,来动态选择出最优的索引信息。其中,通过实时地根据索引字段的数据分布情况,所选择出的索引可能也是不一样的,因为动态变化的数据分布情况会使得所选择出的最优索引信息也可能发生变化。因此,本发明中的技术方案通过结合各索引字段的实际数据分布情况,并通过比较各不同索引字段在所在数据库表中具有的区分度,来分析出最优的索引信息,通过该最优的索引信息针对即将执行的sql脚本进行调整,从而可以使得调整后的sql脚本能够按照最优的索引信息进行相应地执行操作。38.可选地,通过下述方式确定每个索引字段具有的区分度:39.针对每个索引字段,统计所述索引字段对应的索引信息所在的数据库表中具有的业务数据总条数的第一数量;40.对所述索引字段在所述索引信息所在的数据库表中具有的各业务数据值进行去重处理,并统计去重后的至少一个业务数据值的第二数量;41.将所述第二数量与所述第一数量的比值确定为所述索引字段在所述索引信息所在的数据库表中具有的区分度。42.上述技术方案中,针对每个索引字段,需要统计出该索引字段对应的索引信息所在的数据库表中所包含的业务数据总条数的第一数量,并针对索引字段在对应的索引信息所在的数据库表中具有的各业务数据值进行去重处理,即可得到去重后的至少一个业务数据值的第二数量。然后,通过针对第二数量和第一数量进行相应的运算,即可准确地计算出该索引字段在对应的索引信息所在的数据库表中具有的区分度,从而可以为后续能够动态地选择最优的索引信息提供有效地数据支持。43.可选地,通过基于所述第一索引信息,调整所述sql脚本,生成用于在sql执行引擎中执行的sql脚本,包括:44.将所述第一索引信息与强制执行指令符进行组装,得到组装后的第一索引信息;45.将所述组装后的第一索引信息插入至所述sql脚本的数据库表关键字段与所述sql脚本的条件关键字段之间,生成调整后的sql脚本,并通过所述sql执行引擎执行所述调整后的sql脚本。46.上述技术方案中,在需要针对即将执行的sql脚本进行调整时,会在相关表名称后面增加指定索引信息,也即是,将第一索引信息与强制执行指令符进行组装处理,以此将组装后的索引信息插入至相关表名称与条件关键字段之间,以便使得sql执行引擎能够强制引用该索引信息,也就是使得sql执行引擎按照最优的索引信息针对sql脚本进行相应地执行操作。47.第二方面,本发明实施例还提供了一种sql脚本的优化装置,包括:48.识别单元,用于在检测到结构化查询语言sql脚本的执行触发动作时,对sql脚本进行拦截,并通过索引映射库,对拦截到的sql脚本进行识别,确定所述sql脚本是否属于具有多索引信息的脚本;所述索引映射库用于指示各sql脚本的哈希值分别与对应的m个索引信息的映射关系;49.处理单元,用于若确定所述sql脚本属于具有多索引信息的脚本,则基于所述sql脚本对应的多个索引信息以及所述多个索引信息包括的各索引字段具有的区分度,确定用于在执行所述sql脚本时所需的第一索引信息;其中,每个索引字段具有的区分度用于表征该索引字段在对应的索引信息所在的数据库表中,该索引字段具有不同业务数据值的数量占比;通过基于所述第一索引信息,调整所述sql脚本,生成用于在sql执行引擎中执行的sql脚本。50.可选地,所述识别单元具体用于:51.确定所述sql脚本的第一哈希值;52.通过所述sql脚本的第一哈希值,从所述索引映射库中匹配出对应的m个索引信息;53.若m个索引信息的数量满足数量阈值,则确定所述sql脚本属于具有多索引信息的脚本;若m个索引信息的数量不满足数量阈值,则确定所述sql脚本不属于具有多索引信息的脚本。54.可选地,所述识别单元具体用于:55.通过sql参数化模板类函数,将所述sql脚本进行格式化模板提取处理,得到所述sql脚本对应的第一sql模板信息;56.对所述第一sql模板信息进行归一化处理,得到第二sql模板信息;57.对所述第二sql模板信息进行哈希运算,确定所述sql脚本的第一哈希值。58.可选地,所述识别单元具体用于:59.若所述第一sql模板信息中存在有大写格式的字母,则将所述大写格式的字母转化为小写格式的字母,从而得到转化后的第一sql模板信息;60.若所述转化后的第一sql模板信息中存在有动态取值信息,则将所述动态取值信息替换为设定的替换值,从而得到所述第二sql模板信息。61.可选地,所述识别单元具体用于:62.针对任一sql脚本,对所述sql脚本进行分析处理,得到所述sql脚本对应的第三sql模板信息,并对所述第三sql模板信息进行哈希运算,确定所述sql脚本的第二哈希值;63.对所述sql脚本进行分词处理,得到所述sql脚本对应的数据源信息以及条件域信息,并对所述sql脚本对应的数据源信息进行数据库表信息提取处理,得到按序排列的各数据库表信息,对所述sql脚本对应的条件域信息进行解析处理,得到按序排列的各条件字段信息;将所述各数据库表信息与所述按序排列的各条件字段信息进行关联,从而生成数据库表条件字段集合;所述数据库表条件字段集合包括按序排列的各数据库表信息以及每个数据库表信息关联的按序排列的至少一个条件字段信息;64.针对每个数据库表信息,确定所述数据库表信息对应的数据库,并从所述数据库中获取所述数据库表信息具有的按序排列的各索引信息;其中,每个索引信息包括按序排列的至少一个索引字段信息;65.将所述数据库表信息关联的每个条件字段信息与所述数据库表信息具有的按序排列的各索引信息包括的按序排列的至少一个索引字段信息依次进行匹配,并将匹配成功的至少一个索引信息作为用于判断sql脚本是否属于具有多索引信息的脚本的第二索引信息;66.将各sql脚本的第二哈希值以及所述各第二哈希值对应的至少一个第二索引信息存储至所述索引映射库。67.可选地,所述处理单元具体用于:68.针对所述sql脚本对应的任一索引信息,确定所述索引信息所在的数据库表以及所述索引信息包括的至少一个索引字段;69.针对每个索引字段,确定所述索引字段在所述索引信息所在的数据库表中具有的区分度;70.将所述多个索引信息包括的各索引字段具有的区分度进行比对,确定出最大的区分度,并确定出所述最大的区分度对应的第一索引字段;71.将所述第一索引字段对应的索引信息确定为用于在执行所述sql脚本时所需的第一索引信息。72.可选地,所述处理单元具体用于:73.针对每个索引字段,统计所述索引字段对应的索引信息所在的数据库表中具有的业务数据总条数的第一数量;74.对所述索引字段在所述索引信息所在的数据库表中具有的各业务数据值进行去重处理,并统计去重后的至少一个业务数据值的第二数量;75.将所述第二数量与所述第一数量的比值确定为所述索引字段在所述索引信息所在的数据库表中具有的区分度。76.可选地,所述处理单元具体用于:77.将所述第一索引信息与强制执行指令符进行组装,得到组装后的第一索引信息;78.将所述组装后的第一索引信息插入至所述sql脚本的数据库表关键字段与所述sql脚本的条件关键字段之间,生成调整后的sql脚本,并通过所述sql执行引擎执行所述调整后的sql脚本。79.第三方面,本发明实施例提供一种计算设备,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行上述第一方面任意所述的sql脚本的优化方法。80.第四方面,本发明实施例提供一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述第一方面任意所述的sql脚本的优化方法。附图说明81.为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。82.图1为本发明实施例提供的一种可能的系统架构示意图;83.图2为本发明实施例提供的一种sql脚本的优化方法的流程示意图;84.图3为本发明实施例提供的一种针对sql语句进行格式化模板信息提取的示意图;85.图4为本发明实施例提供的一种sql脚本的优化装置的结构示意图;86.图5为本发明实施例提供的一种计算设备的结构示意图。具体实施方式87.为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。88.为了便于理解本技术实施例,首先以图1中示出的一种可能的系统架构为例说明适用于本技术实施例的sql脚本的优化系统架构。该sql脚本的优化系统架构可以应用于针对存在多索引问题的即将执行的sql脚本的优化。如图1所示,该系统架构可以包括代理模块100和多索引分析模块200。89.其中,本发明实施例通过采用java字节码技术,在应用程序的sql运行代码前后进行插桩,即插入相应的sql代理模块(即代理模块100),对sql运行脚本进行解析和语法分析,以此识别sql运行脚本是否存在多索引问题。也即是说,代理模块100的功能主要是识别sql运行脚本是否具有多索引信息,比如,在通过代理模块100检测sql(structuredquerylanguage,结构化查询语言)脚本的执行触发动作时,即可针对sql脚本拦截,并针对拦截到的sql脚本进行归一化处理,得到sql模板信息。再通过数据库(比如索引映射库)针对sql脚本进行识别,即通过sql脚本的哈希值在索引映射库中进行多索引信息的匹配,也即是通过索引映射库判断sql脚本是否命中多索引,如果未命中,则可以直接通过sql执行引擎执行sql脚本,如果命中,则需要根据sql脚本关联的至少一个索引信息以及至少一个索引信息包括的各索引字段的数据分布情况,即可识别出最优的索引信息,并通过最优的索引信息针对sql脚本进行相应地调整,从而使得sql执行引擎按照最优的索引信息针对sql脚本进行相应地执行操作。然后,可以将调整后的sql脚本以及sql模板信息存储至数据库中。90.此外,为了提升针对即将执行的sql脚本是否存在有多索引信息的识别性能,需要提前针对各sql脚本进行多索引分析,同时需要分析出各sql脚本所关联的索引信息以及所关联的索引字段信息,也即是通过多索引分析模块200提前分析各sql脚本中每个sql脚本是否命中多索引。具体来说,多索引分析模块200会按照设定的时间间隔(比如每间隔5秒、10秒、20秒、30秒或30秒以上等)进行触发分析任务的执行。在满足任务执行启动时间时,即可从数据库中获取各sql脚本,即获取sql脚本列表信息,针对任一sql脚本,针对该sql脚本进行分词处理,即可提取出该sql脚本对应的数据源信息以及条件域信息。再针对数据源信息进行表信息提取,得到至少一个数据库表信息,并针对条件域信息进行条件信息提取,得到至少一个条件字段信息,以及将至少一个数据库表信息与至少一个条件字段信息进行关联,即可得到数据库表条件字段集合,该数据库表条件字段集合包括按序排列的各数据库表信息以及每个数据库表信息关联的按序排列的至少一个条件字段信息。然后,针对每个数据库表信息,获取该数据库表信息的数据库,并从该数据库中获取相应的按序排列的各索引信息,将该数据库表信息关联的每个条件字段信息与该数据库表信息具有的按序排列的各索引信息包括的按序排列的至少一个索引字段信息依次进行匹配,从而判断sql脚本是否具有多索引属性,同时会确定每个sql脚本对应的sql模板信息的哈希值。最后,将各哈希值以及各哈希值多样的多索引状况(比如某一哈希值对应一个索引信息,或者某一哈希值对应多个索引信息等)存储至索引映射库,或者也可以存储至其它数据库中(比如mysql数据库、oracle数据库等)。91.需要说明的是,上述图1所示的系统架构仅是一种示例,本发明实施例对此并不做限定。92.图2示例性的示出了本发明实施例提供的一种sql脚本的优化方法的流程,该流程可以由sql脚本的优化装置执行。其中,sql脚本的优化装置可以是服务设备或者也可以是能够支持服务设备实现该方法所需的功能的部件(比如芯片或集成电路)等,当然也可以是其它具有实现该方法所需的功能的电子设备。93.如图2所示,该流程具体包括:94.步骤201,在检测到结构化查询语言sql脚本的执行触发动作时,对sql脚本进行拦截,并通过索引映射库,对拦截到的sql脚本进行识别,确定所述sql脚本是否属于具有多索引信息的脚本。95.本发明实施例中,在针对即将执行的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模板信息。96.再者,可以针对该sql脚本进行分词处理,即可得到该sql脚本对应的数据源信息以及条件域信息,并可以针对该sql脚本对应的数据源信息进行数据库表信息提取处理,即可得到按序排列的各数据库表信息,同时可以对sql脚本对应的条件域信息进行解析处理,即可得到按序排列的各条件字段信息;将所述各数据库表信息与所述按序排列的各条件字段信息进行关联,从而可以生成数据库表条件字段集合。其中,数据库表条件字段集合可以包括按序排列的各数据库表信息以及每个数据库表信息关联的按序排列的至少一个条件字段信息,或者也可以包括条件字段信息后面附带的操作符信息。然后,针对每个数据库表信息,可以确定出该数据库表信息对应的数据库,并可以从该数据库中获取该数据库表信息具有的按序排列的各索引信息。其中,每个索引信息可以包括按序排列的至少一个索引字段信息。最后,可以将该数据库表信息关联的每个条件字段信息与该数据库表信息具有的按序排列的各索引信息包括的按序排列的至少一个索引字段信息依次进行匹配,并可以将匹配成功的至少一个索引信息作为用于判断sql脚本是否属于具有多索引信息的脚本的第二索引信息,以及可以将各sql脚本的第二哈希值以及各第二哈希值对应的至少一个第二索引信息存储至索引映射库中。如此,也即是生成各哈希值与各哈希值对应的至少一个第二索引信息的映射关系,从而可以为便于后续识别即将执行的sql脚本是否存在有多索引信息提供有效地支持。97.需要说明的是,sql脚本可以是针对业务系统中的不同业务逻辑编写的不同脚本,比如,sql脚本可以包括sql查询脚本(比如select脚本)、sql插入脚本(比如insert脚本)、sql删除脚本(比如delete脚本)、sql修改脚本(比如update脚本)等,当然还可以包括针对数据库进行其他操作的脚本。98.示例性地,在多索引分析模块,可以定期扫描多索引分析任务,比如每天凌晨2:30启动扫描任务。如此,在检测到多索引分析任务启动时,即可从数据库中获取sql列表信息,该sql列表信息中包括多个sql脚本,针对任一sql脚本(比如某一sql语句),通过针对该sql脚本进行格式化模板提取和归一化处理后,即可得到该sql脚本对应的sql模板信息,并通过设定的哈希算法,比如md2算法(messagedigestalgorithm2,信息-摘要算法2)、md4算法、md5算法和sha-1算法(securehashalgorithm,安全散列算法),针对该sql模板信息进行哈希运算,即可得到该sql脚本对应的哈希值。再针对该sql脚本进行分词处理,以sql查询脚本为例,通常select语句的基本语法为[select选项]字段列表[from]数据源[where字句][groupby子句][having子句][orderby子句][limit子句];基于上述语法,需要根据相对应的关键字信息,从执行的sql语句汇总提取相关的关键字领域信息。其中,提取的关键字及领域关键字实际取值信息可以如表1所示。其中,表1中所展示的内容以select语句为selectid,batch_id,script_id,success_countfromtbl_batch_resultwhereid》0andbatch_idbetween100and110groupbyscript_idorderbyscript_idlimit100为例。[0099]表1[0100][0101][0102]其中,针对上述sql语句进行分词处理(具体是提取关键字信息)的具体流程为:[0103]步骤1、从sql语句中逐个查找关联子列表中[select/from/where/having/groupby/orderby/limit]的相关关键字所对应的位置及实际取值信息。[0104]步骤2、从sql语句中寻找关键字的位置,关键字记为key,位置记为key-loc。比如,key为select,则位置loc为1。[0105]步骤3、截取该关键字之后的信息为keyafter。比如,select-after为id,batch_id,script_id,success_countfromtbl_batch_resultwhereid》0andbatch_idbetween100and110groupbyscript_idorderbyscript_idlimit100。[0106]步骤4、对keyafter之后的语句继续进行其他关键字位置的获取。[0107]步骤5、获取到下一关键字nextkey之后,记录下一关键字起始位置netkeystartloc。比如,nexkey为from,关键字from的loc为45。[0108]步骤6、截取keyloc位置到netkeystartloc位置之间的字符信息,作为关键字key的信息。比如,select和from之间的信息为id,batch_id,script_id,success_count。则关键字select的实际信息为id,batch_id,script_id,success_count。[0109]步骤7、循环步骤2至步骤6,直至结束。[0110]步骤8、基于上述操作,则从sql语句中提取到该sql语句的数据源信息、操作字段信息以及条件域信息、分组信息等,可以供后面步骤使用。[0111]其中,由于在sql语句的索引选择中需要提前知道sql操作语句所针对的具体表信息,从而可以从索引表中获取到对应表的索引信息,所以需要知道每条sql语句中所针对表的具体信息,即sql操作表。具体地,针对上述针对sql语句所提取出的数据源信息,需要针对该数据源信息做更详细的区分,从中识别出相关的操作表信息,其中,操作表的内容有操作表个数、表名称/表别名。其中,操作表的具体格式如tblnum,tbllist[tblname1/tblalias1,tblname2/tblalias2]。[0112]其中,对于数据源信息主要分以下几种情况:[0113]第一、正常情况下,针对数据源信息在去除左右空格后,无空格或者逗号字符,则为通用情况。此时所提取到的内容即为所操作的表。比如,以下述sql语句为例,即selectid,name,agefromtbl_testwhereid》10,此时所提取到的操作表的内容有表个数1,tbllist[tbl_test/]。[0114]第二、表别名情况,针对数据源信息在去除左右空格后,仅包含空格,则为别名情况。此时需要提取表名称以及表别名。比如,以下述sql语句为例,即selecta.id,a.name,a.agefromtbl_testawherea.id》10,此时所提取到的操作表的内容有表个数1,tbllist[tbl_test/a]。[0115]第三、多表情况,针对数据源信息中如果包含逗号的情况,则为多表情况。多表场景中也会存在表名别的情况,因此需要对此进行区分。其中,提取方式为:首先对逗号进行切分,切分后的每一切分端即为一个表信息。然后,对每个表信息判断是否存在空格,如果不存在,则无表别名;如果存在,则需要对空格进行切分,切分后的前部分为表名称,后一部分为表别名。比如,以下述sql语句为例,selecta.id,a.name,a.age,b.locfromtbl_test1a,tbl_test2bwherea.id》10anda.id=b.id,此时所提取到的操作表的内容有表个数2,tbllist[tbl_test1/a,tbl_test2/b]。[0116]再者,针对上述针对sql语句所提取出的条件域信息,需要针对sql语句的条件域信息进行解析,即可提取出sql语句的条件字段、条件字段顺序、条件字段操作符等信息。其中,对于条件字段主要是通过and字段来组合多个条件信息的,针对sql语句的条件域信息进行解析的具体操作方法为:[0117]步骤a、遍历条件域信息,可以获取到第一个and词组的位置,其中,提取信息为and_before、and_after。and前面的信息为and_before,and词语后面的部分为and_after。[0118]步骤b、判断and_before信息中是否存在between。如果不存在,则and_before信息为条件字段信息,并对该条件字段信息进行字段提取。具体需要根据如下操作符信息进行字段提取。其中,操作符信息有=、!=、》、》=、《、《=、in、like等。首先针对条件域信息根据操作符信息进行切分,切分后左侧信息即为条件字段信息。再在提取到字段信息后,需要判断字段信息是否包含.符号(即英文中的小圆句号),如果包含,则表示包含数据库表信息,并可以针对.进行切分,即可提取出数据库表信息。如此,最终可以获取到的信息为表信息/字段名称/操作符信息。[0119]步骤c、如果and_before信息中存在between,则从条件字段中提取下一个and的位置,获取下一个and介词之前的信息,共同组成betweenand信息,即fieldnamebetween?and?。然后,对此betweenand信息进行切分,分词为between,切分前一部分信息即为条件字段信息。在提取到字段信息后,判断字段信息是否包含.符号(即英文中的小圆句号),如果包含,则表示包含表信息,并可以针对.进行切分,即可提取出数据库表信息。最后,提取到的信息为[表信息/字段信息/between]。[0120]步骤d、循环步骤a至步骤c,遍历完所有的and信息。[0121]步骤e、最后可以获取到条件字段列表信息,每个条件字段信息都包含[表信息/字段名称/操作信息]。如此,最终获取到的条件字段列表信息可以为如下形式:fieldlist[tablename/fieldname1/=,tablename/fieldname2/》,…]。其中,对条件字段列表信息进行分组,相同数据库表的字段信息放在一组,即可生成表条件字段列表信息,该表条件字段列表信息可以为如下形式:[tbl1[fieldname1/=,fieldnam2/》…],tbl2[fieldname1/=,fieldnam2/》…],…]。[0122]需要说明的是,由于索引信息一般是根据条件字段来选取的,此处获取的条件字段信息,主要表示sql语句中涉及条件的对应表和字段信息,一般主要根据这个信息去匹配可能使用的索引信息。由于数据库在建立索引的时候都是进行排序的,索引选择的时候一般都遵循最左匹配原则以及排序字段需要相同,因此,此处的操作信息主要判断索引选择是否符合上述索引选择规则从而可以使得选择出的索引生效。[0123]此外,通过上述获取的条件字段列表信息可以获取到相关数据库表信息,并通过相关数据库表信息可以查询到相应的数据库,通过相应的数据库即可获取到相关的索引信息以及相关的索引信息包括的索引字段信息。比如,上述获取的条件字段列表信息为tbl1[field1/=,field2/],tbl2[field3/=,field4/》],如此,通过该条件字段列表信息即可获取到相关的表信息(比如tbl1和tbl2),再连接对应的数据库,即可从数据库中获取该表的相关索引字段信息。其中,从数据库中获取该表的相关索引字段记录内容为:tbl1-》[index1(field1,field2),index2(field3,field4)],tbl2-》[index1(field2)]。[0124]然后,根据从数据库中获取该表的相关索引字段信息以及上述获取的条件字段列表信息,即可识别上述sql语句是否命中多索引。其中,具体识别过程为:[0125]步骤1、通过遍历上述获取到的条件字段列表信息[tbl1[fieldname1/=,fieldname2/》…],tbl2[fieldname1/=,fieldname2/》…],…],即可获取到每张表的条件字段信息,比如,以数据库表tbl1为例,可以获取到该数据库表tbl1的条件字段信息为tbl1[field1/=,field2/=,field3/》]。[0126]步骤2、分别对每张表做如下操作,例如,对于tbl1,根据上述获取到的对应表tbl1的索引信息(比如tbl1-》[index1(field1,field2),index2(field3,field4)]),遍历tbl1的索引字段列表内容,即可得到至少一个索引信息为[index1(field1,field2),index2(field3)],对每个索引信息逐个字段匹配数据库表tbl1的条件字段信息tbl1[field1/=,field2/=,field3/》],tbl2[fieldname1/=,fieldnam2/》…],…]中的对应表tbl1字段信息[field1/=,field2/=,field3/》],比如可以匹配到索引信息index1(field1,field2),ndex2(field3,field4)。如果索引字段同查询条件字段能够匹配,则表示命中该索引,记录命中的索引及索引字段信息。例如,数据库表tbl1所在的sql语句命中的索引信息有index1(field1,field2)、index2(field3)。[0127]步骤3、重复执行上述步骤1至步骤2,直至完成sql语句涉及到的所有数据库表的索引匹配。[0128]最后,针对任一sql语句,将该sql语句对应的哈希值与通过上述方式确定出的索引匹配信息(即对应多少个索引信息,比如一个、两个或两个以上等)进行关联映射,比如,针对某一sql语句匹配到对应的索引信息为一个,则会针对该sql语句对应的哈希值所关联的索引匹配信息标记上单索引属性,或者针对某一sql语句匹配到对应的索引信息为两个或两个以上,则会针对该sql语句对应的哈希值所关联的索引匹配信息标记上多索引属性,并将关联映射后的哈希值、对应的索引匹配信息(比如一个、两个或两个以上索引信息)存储至索引映射库中,以便代理模块能够及时地使用该索引映射库进行判断即将执行的sql脚本是否会命中多索引。[0129]进一步地,在建立好索引映射库后,即可利用该索引映射库针对拦截到的即将执行的sql脚本进行识别,以此判断即将执行的sql脚本是否命中多索引。具体地,在检测到某一sql脚本的执行触发动作时,即可针对该sql脚本进行拦截,比如可以通过在应用程序的sql运行代码前后插桩,插入相应的sql代理模块来针对该sql脚本进行拦截,并通过索引映射库针对拦截到的sql脚本进行识别,从而可以准确地判断sql脚本是否属于具有多索引信息的脚本,也即是判断sql脚本是否存在多索引问题。其中,具体地识别过程为:首先确定sql脚本的第一哈希值,比如,通过设定的哈希算法(比如md5算法)针对该sql脚本进行哈希运算,计算该sql脚本的哈希值。再通过sql脚本的第一哈希值,从索引映射库中匹配出该第一哈希值对应的m个索引信息,并统计该第一哈希值对应的m个索引信息的数量,如果该数量满足数量阈值,则可以确定该sql脚本属于具有多索引信息的脚本,此时需要针对该sql脚本进行调整,如果m个索引信息的数量不满足数量阈值,则可以确定该sql脚本不属于具有多索引信息的脚本,此时无需针对该sql脚本进行调整,可以直接在sql执行引擎执行,比如假设数量阈值为2,如果统计该第一哈希值对应的m个索引信息的数量为3,可知3大于2,则可以确认该sql脚本命中多索引,如果统计该第一哈希值对应的m个索引信息的数量为1,可知1小于2,则可以确认该sql脚本未命中多索引。其中,数量阈值可以根据本领域技术人员的经验或可以根据多次实验所得结果或可以根据实际应用场景进行设置,本发明实施例对此并不作限定;m为大于等于1的整数。[0130]需要说明的是,在针对业务系统执行的sql脚本进行拦截后,需要针对该sql脚本进行相应的处理,以此便于提升针对sql脚本的多索引判断效率,即,针对sql脚本进行格式化模板提取和归一化处理,将参数取值不同但是业务逻辑相同的多个sql脚本整合成为一个sql模板,然后针对sql模板进行哈希运算来确定sql模板的哈希值,也即是针对参数取值不同但是业务逻辑相同的多个sql脚本所对应的哈希值都是相同的,而且参数取值不同但是业务逻辑相同的多个sql脚本所对应的索引信息也是一样的,也即是在索引映射库中存储一个哈希值以及该哈希值对应的m个索引信息即可。也即是,通过sql参数化模板类函数,将sql脚本进行格式化模板提取处理,即可得到sql脚本对应的第一sql模板信息,并对第一sql模板信息进行归一化处理,即可得到第二sql模板信息。然后,对第二sql模板信息进行哈希运算,即可确定sql脚本的第一哈希值。其中,为了准确地将参数取值不同但是业务逻辑相同的多个sql脚本整合成为一个sql模板,会针对经过格式化模板提取处理的sql脚本进行归一化处理,即,如果第一sql模板信息中存在有大写格式的字母,则可以将大写格式的字母转化为小写格式的字母,以此得到转化后的第一sql模板信息,并在确定转化后的第一sql模板信息中存在动态取值信息时,即可将动态取值信息替换为设定的替换值,以此可以实现sql模板信息的格式统一。[0131]示例性地,在实际的业务系统表操作过程中,系统的sql业务逻辑基本是不会变化wherelimit?。[0141]第五、针对sql模板信息中的比较操作符进行右值格式化处理。[0142]sql语法操作中会存在一些比较操作,比如,比较操作符有》、》=、《、《=、==、!=等,针对这些比较操作符的右值,如果存在具体值,则需要对这些比较操作符的右值统一化处理,将这些比较操作符的右具体值转变为动态值。比如,某一sql模板信息为:select*fromwhereid》10;将该sql模板信息中的大写格式字母转换为小写格式字母,以及将该sql模板信息中的比较操作符进行右值格式化处理,即可得到处理后的sql模板信息为:select*fromwhereid》?。[0143]步骤202,若确定所述sql脚本属于具有多索引信息的脚本,则基于所述sql脚本对应的多个索引信息以及所述多个索引信息包括的各索引字段具有的区分度,确定用于在执行所述sql脚本时所需的第一索引信息。[0144]本发明实施例中,针对任一sql脚本,如果确定该sql脚本属于具有多索引信息的脚本,则需要针对该sql脚本进行相应地调整。即,通过基于sql脚本对应的多个索引信息以及sql脚本对应的多个索引信息包括的各索引字段的实时数据分布情况,来动态选择出最优的索引信息,以此通过该最优的索引信息针对sql脚本进行相应地调整。具体地,针对该sql脚本对应的任一索引信息,可以确定该索引信息所在的数据库表以及该索引信息包括的至少一个索引字段,并针对每个索引字段,可以确定出该索引字段在还索引信息所在的数据库表中具有的区分度,从而可以确定出多个索引信息包括的各索引字段所具有的区分度。然后,将多个索引信息包括的各索引字段具有的区分度进行比对,可以确定出最大的区分度,并可以确定出最大的区分度对应的第一索引字段,该第一索引字段对应的索引信息可以作为用于在执行sql脚本时所需的第一索引信息,也即是最优或最合适的索引信息,利用该第一索引信息针对sql脚本进行相应地调整,从而可以使得调整后的sql脚本能够按照最优的索引信息进行相应地执行操作。[0145]其中,针对任一索引信息,对于该索引信息包括的至少一个索引字段中每个索引字段,可以统计该索引字段对应的该索引信息所在的数据库表中具有的业务数据总条数的第一数量,并针对该索引字段在该索引信息所在的数据库表中具有的各业务数据值进行去重处理,即可得到去重后的至少一个业务数据值,以及可以统计去重后的至少一个业务数据值的第二数量。然后,计算第二数量与第一数量的比值,并可以将该比值作为该索引字段在对应的索引信息所在的数据库表中具有的区分度,从而可以为后续能够动态地选择最优的索引信息提供有效地数据支持。[0146]示例性地,针对任一sql语句,可以通过代理模块根据该sql语句对应的哈希值,从索引映射库中匹配出该sql语句对应的多个索引信息,并针对每个索引信息,可以判断该索引信息包括的每个索引字段的数据分布情况(即每个索引字段具有的业务字段值的分布情况),从而可以根据各索引信息中包括的各索引字段具有的业务字段值的分布情况,确定出最优的索引选择策略,也即是选择出最优的索引信息。其中,针对选择最优的索引信息,具体地选择过程为:[0147]步骤1、遍历多索引信息列表。[0148]步骤2、针对每个索引信息,获取该索引信息包括的至少一个索引字段,从该索引信息关联的相关表中获取每个索引字段的分组值(即字段取值),分组值的获取是通过查询表的方式实现的。比如,针对某一数据库表(比如tbl1),索引字段为field1,field2,那么查询语句为:selectcount(1)fromtbl1wheregroupbyfield1,field2。需要说明的是,此处根据索引字段从相关表中获取相关索引分组的离散程度(即通过分组来获取记录总数)。分组离散程度越高,说明字段取值越分散,该字段区分度也是最高的,通过该字段查询索引效率也是最高的。[0149]其中,groupby表示对应字段不同取值的个数,对于同一张表,表的记录数是确定的,那么分组数越大,则该字段组合占用表的比率也就越大,也就说明该字段组合越分散。比如,如表2所示。[0150]表2[0151]field112345678910field211111212131314141516[0152]基于表2,如果按filed1分组,则分组数为10,如果按field2分组,则分组数为6,相比较来看,filed1更加离散一些,即离散度更高,也即是filed1的区分度更高。需要说明的是,而索引查找的时候,首先是根据索引信息查询到对应的索引记录,在根据索引记录中的主键id(每个索引记录都会有对应的主键id)。再根据主键id从主键对应的数据记录中获取到所需要的信息。因此,如果索引区分度越高,则会更快到找到对应的记录。[0153]步骤3、将针对各索引信息所计算出的分组数占比进行比较,即可获取分组数最大的索引信息名称。[0154]比如,针对tbl1对应的两个索引信息,即索引信息index1(filed1,filed2)和索引信息index2(filed3),假设索引信息index2中包括的索引字段filed3的分组数占比最大,则可以将index2作为用于调整或优化sql脚本的最优索引信息。[0155]此外,需要说明的是,现有技术中,由于误选索引是数据库引擎来操作的,业务开发人员并无法感知。只有在生产出现问题的时候(比如sql执行时长过长),才能知道索引误选。为了解决索引误选的问题,开发人员只能在出现问题后,需要修改sql语句,在sql语句中使用forceindex(index_name)强制指定索引字段,然后重新构建应用系统并部署系统,将新的sql语句通过应用程序版本发布到生产环境上才能解决该问题。其中,sql语句都是包含在应用程序代码中的,出现问题后,修复sql语句,也就意味着需要修改应用程序代码,并在修改完成后需要重新发布版本,以及在生产环境中重新部署才能解决该问题,所以修复成本比较高。其中,可以看出,现有技术在解决多索引场景误选索引的问题时,就是在sql语句中强制指定索引,这是一种固化的方式,默认数据分布是固定的,可是,在真实的生产数据中,数据分布是随时变化的,当某类数据分布发生变化的时候,指定的索引就会失效。然而,在本发明的技术方案中,在应用程序运行的时候,对sql执行语句进行实时解析,识别出sql语句中的条件字段。再根据条件字段获取sql语句相关联表的实时数据分布形态,根据一定的索引选择策略,动态地选择最合适的索引信息,并通过该最合适的索引信息自动更改sql执行语句,使得sql执行引擎能够强制引用该最合适的索引信息进行运行sql语句,如此就可以有效地解决多索引场景下误选索引的情况。[0156]步骤203,通过基于所述第一索引信息,调整所述sql脚本,生成用于在sql执行引擎中执行的sql脚本。[0157]本发明实施例中,在需要针对即将执行的sql脚本进行调整时,会在该即将执行的sql脚本的相关表名称后面增加指定索引信息,也即是,可以将第一索引信息与强制执行指令符进行组装,即可得到组装后的索引信息。然后,可以将组装后的索引信息插入至相关表名称与条件关键字段之间,如此可以使得sql执行引擎能够强制引用该索引信息进行运行sql脚本,也就是,sql执行引擎会按照最优的索引信息针对sql脚本进行相应地执行操作。[0158]示例性地,针对某一sql语句,假设该sql语句为selectid,name,agefromtbl1wherefield1》10andfield2》10andfield3=‘aa’。且假设通过上述确定最优索引信息的步骤获得的最优索引信息为index2,那么针对该sql语句进行相应地调整后,即可得到调整后的sql语句为selectid,name,agefromtbl1forceindex(index2)wherefield1》10andfield2》10andfield3=‘aa’。如此,在通过代理模块针对该sql语句进行相应的调整后,即可将调整后的sql语句下发到sql执行引擎进行针对该调整后的sql语句的执行操作。此外,需要说明的是,由于在实际的运维过程中,运维人员会针对表进行相关的操作,比如增、删、改索引等操作。那么,在索引变更后,则相应的sql语句中的索引信息也会相应地变动。如此,为了便于多索引分析模块定期地针对sql语句对应的索引信息进行更新分析,那么在每个sql语句执行完成后,sql语句以及sql归一化信息(即归一化后的sql模板信息)都需要异步发送给消息中间件,由多索引分析模块对sql语句进行定时的多索引分析。[0159]上述实施例表明,本发明中的技术方案通过针对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脚本误选索引问题的修复成本。[0160]基于相同的技术构思,图4示例性的示出了本发明实施例提供的一种sql脚本的优化装置,该装置可以执行sql脚本的优化方法的流程。其中,sql脚本的优化装置可以是服务设备或者也可以是能够支持服务设备实现该方法所需的功能的部件(比如芯片或集成电路)等,当然也可以是其它具有实现该方法所需的功能的电子设备。[0161]如图4所示,该装置包括:[0162]识别单元401,用于在检测到结构化查询语言sql脚本的执行触发动作时,对sql脚本进行拦截,并通过索引映射库,对拦截到的sql脚本进行识别,确定所述sql脚本是否属于具有多索引信息的脚本;所述索引映射库用于指示各sql脚本的哈希值分别与对应的m个索引信息的映射关系;[0163]处理单元402,用于若确定所述sql脚本属于具有多索引信息的脚本,则基于所述sql脚本对应的多个索引信息以及所述多个索引信息包括的各索引字段具有的区分度,确定用于在执行所述sql脚本时所需的第一索引信息;其中,每个索引字段具有的区分度用于表征该索引字段在对应的索引信息所在的数据库表中,该索引字段具有不同业务数据值的数量占比;通过基于所述第一索引信息,调整所述sql脚本,生成用于在sql执行引擎中执行的sql脚本。[0164]可选地,所述识别单元401具体用于:[0165]确定所述sql脚本的第一哈希值;[0166]通过所述sql脚本的第一哈希值,从所述索引映射库中匹配出对应的m个索引信息;[0167]若m个索引信息的数量满足数量阈值,则确定所述sql脚本属于具有多索引信息的脚本;若m个索引信息的数量不满足数量阈值,则确定所述sql脚本不属于具有多索引信息的脚本。[0168]可选地,所述识别单元401具体用于:[0169]通过sql参数化模板类函数,将所述sql脚本进行格式化模板提取处理,得到所述sql脚本对应的第一sql模板信息;[0170]对所述第一sql模板信息进行归一化处理,得到第二sql模板信息;[0171]对所述第二sql模板信息进行哈希运算,确定所述sql脚本的第一哈希值。[0172]可选地,所述识别单元401具体用于:[0173]若所述第一sql模板信息中存在有大写格式的字母,则将所述大写格式的字母转化为小写格式的字母,从而得到转化后的第一sql模板信息;[0174]若所述转化后的第一sql模板信息中存在有动态取值信息,则将所述动态取值信息替换为设定的替换值,从而得到所述第二sql模板信息。[0175]可选地,所述识别单元401具体用于:[0176]针对任一sql脚本,对所述sql脚本进行分析处理,得到所述sql脚本对应的第三sql模板信息,并对所述第三sql模板信息进行哈希运算,确定所述sql脚本的第二哈希值;[0177]对所述sql脚本进行分词处理,得到所述sql脚本对应的数据源信息以及条件域信息,并对所述sql脚本对应的数据源信息进行数据库表信息提取处理,得到按序排列的各数据库表信息,对所述sql脚本对应的条件域信息进行解析处理,得到按序排列的各条件字段信息;将所述各数据库表信息与所述按序排列的各条件字段信息进行关联,从而生成数据库表条件字段集合;所述数据库表条件字段集合包括按序排列的各数据库表信息以及每个数据库表信息关联的按序排列的至少一个条件字段信息;[0178]针对每个数据库表信息,确定所述数据库表信息对应的数据库,并从所述数据库中获取所述数据库表信息具有的按序排列的各索引信息;其中,每个索引信息包括按序排列的至少一个索引字段信息;[0179]将所述数据库表信息关联的每个条件字段信息与所述数据库表信息具有的按序排列的各索引信息包括的按序排列的至少一个索引字段信息依次进行匹配,并将匹配成功的至少一个索引信息作为用于判断sql脚本是否属于具有多索引信息的脚本的第二索引信息;[0180]将各sql脚本的第二哈希值以及所述各第二哈希值对应的至少一个第二索引信息存储至所述索引映射库。[0181]可选地,所述处理单元402具体用于:[0182]针对所述sql脚本对应的任一索引信息,确定所述索引信息所在的数据库表以及所述索引信息包括的至少一个索引字段;[0183]针对每个索引字段,确定所述索引字段在所述索引信息所在的数据库表中具有的区分度;[0184]将所述多个索引信息包括的各索引字段具有的区分度进行比对,确定出最大的区分度,并确定出所述最大的区分度对应的第一索引字段;[0185]将所述第一索引字段对应的索引信息确定为用于在执行所述sql脚本时所需的第一索引信息。[0186]可选地,所述处理单元402具体用于:[0187]针对每个索引字段,统计所述索引字段对应的索引信息所在的数据库表中具有的业务数据总条数的第一数量;[0188]对所述索引字段在所述索引信息所在的数据库表中具有的各业务数据值进行去重处理,并统计去重后的至少一个业务数据值的第二数量;[0189]将所述第二数量与所述第一数量的比值确定为所述索引字段在所述索引信息所在的数据库表中具有的区分度。[0190]可选地,所述处理单元402具体用于:[0191]将所述第一索引信息与强制执行指令符进行组装,得到组装后的第一索引信息;[0192]将所述组装后的第一索引信息插入至所述sql脚本的数据库表关键字段与所述sql脚本的条件关键字段之间,生成调整后的sql脚本,并通过所述sql执行引擎执行所述调整后的sql脚本。[0193]基于相同的技术构思,本发明实施例还提供了一种计算设备,如图5所示,包括至少一个处理器501,以及与至少一个处理器连接的存储器502,本发明实施例中不限定处理器501与存储器502之间的具体连接介质,图5中处理器501和存储器502之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。[0194]在本发明实施例中,存储器502存储有可被至少一个处理器501执行的指令,至少一个处理器501通过执行存储器502存储的指令,可以执行前述的sql脚本的优化方法中所包括的步骤。[0195]其中,处理器501是计算设备的控制中心,可以利用各种接口和线路连接计算设备的各个部分,通过运行或执行存储在存储器502内的指令以及调用存储在存储器502内的数据,从而实现数据处理。可选的,处理器501可包括一个或多个处理单元,处理器501可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理下发指令。可以理解的是,上述调制解调处理器也可以不集成到处理器501中。在一些实施例中,处理器501和存储器502可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。[0196]处理器501可以是通用处理器,例如中央处理器(cpu)、数字信号处理器、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合sql脚本的优化方法实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。[0197]存储器502作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器502可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(randomaccessmemory,ram)、静态随机访问存储器(staticrandomaccessmemory,sram)、可编程只读存储器(programmablereadonlymemory,prom)、只读存储器(readonlymemory,rom)、带电可擦除可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、磁性存储器、磁盘、光盘等等。存储器502是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明实施例中的存储器502还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。[0198]基于相同的技术构思,本发明实施例还提供了一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述sql脚本的优化方法的步骤。[0199]本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。[0200]本发明是参照根据本发明的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。[0201]这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。[0202]这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。[0203]尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。[0204]显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本技术权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献