一种对查询sql请求进行优化的方法及装置的制作方法

文档序号:6574517阅读:306来源:国知局
专利名称:一种对查询sql请求进行优化的方法及装置的制作方法
技术领域
本发明涉及数据库应用领域,特别是涉及对查询SQL请求进行优化领域。
背景技术
在大型的软件应用系统中,经常需要把程序和数据库结合起来进行使用,在应用系统中,涉及到的数据量特别大,对于中大型应用,数据库记录数在百万数量级以上,数据库系统需要同时处理来自多个客户端的SQL(StructuredQuery Language,结构化查询语言)请求,数据库系统的处理速度成为系统运行速度的瓶颈。对于质量不高的SELECT SQL请求(查询SQL语句),其中可能包含有冗余的列、数据库表连接和过滤条件等,这些都会影响数据库系统的性能、增加数据库锁和数据库资源的消耗,并影响SELECT SQL的并发执行,进而影响整个应用系统的正常运行;对于数据库系统本身的数据库表的优化一般在库表设计过程中完成,例如,合理的设计表的结构、增加键和索引等。于是,如何优化应用系统发送给数据库系统的SELECT SQL语句,以达到使其最快的执行、占用最少的数据库资源成为软件开发过程中要解决的问题。在现有技术中,一般通过下面两种方法来解决这个问题1、将应用程序发送给数据库系统的SELECT SQL代码做静态分析,采用人工方式提高SELECT SQL质量,减少其中表连接、多余列名和冗余的过滤条件。由于一个应用系统往往有上千、甚至上万条不同的SQL运行,这种方法的缺点是工作量极大,耗费大量人力资源,成本高,优化效率低。
2、对于采用O-R Mapping Select SQL系统生成的SELECT SQL,由于SELECTSQL是动态生成的,不能进行静态分析,可以由专业的数据库优化专家,逐个跟踪分析优化O-R Mapping Select SQL的执行计划。但这种方法的工作量也非常大,使用专家的成本高,优化效率低。
可见,在现有的SELECT SQL优化方法中,存在着优化成本高和优化效率低的问题。

发明内容
本发明所要解决的技术问题是提供一种对查询SQL请求进行优化的方法及装置,以解决现有技术存在的优化成本高和优化效率低的问题。
为了解决上述问题,根据本发明的一个实施例,公开了一种优化方法,包括规范处理查询SQL语句中的字段名及别名;去掉所述S查询SQL语句中的冗余的关联关系;将所述查询SQL语句转换为语法树;将所述语法树进行逻辑关系优化;将优化后的语法树转化为标准查询SQL语句。
其中,所述去掉所述查询SQL语句中的冗余的关联关系,优选的,可以是去除冗余的列、去除冗余的链接关系或者去除冗余的查询条件。
优选的,所述对语法树进行优化是优化所述语法树中的分组条件、HAVING关系、链接关系、SELECT关系或排序规则。
根据本发明的另一个实施例,公开了一种对查询SQL请求进行优化的装置,包括,规范处理单元,用于规范处理查询SQL语句中的字段名及别名;冗余处理单元,用于去掉所述查询SQL语句L中的冗余的关联关系;第一转换单元单元,用于将所述查询SQL语句转换为语法树;优化处理单元,用于将所述语法树进行逻辑关系优化;第二转换单元单元,用于将优化后的语法树转化为标准查询SQL语句。
其中,优选的,所述冗余处理单元包括冗余列处理单元,用于去除冗余的列;或者,冗余链接关系处理单元,用于去除冗余的链接关系;或者,冗余查询条件处理单元,用于去除冗余的查询条件关系。
其中,优选的,所述优化处理单元包括分组条件优化处理单元,或者,HAVING关系优化处理单元,或者,链接关系优化处理单元,或者,SELECT关系优化处理单元,或者,排序规则优化处理单元;所述分组条件优化处理单元,用于优化分组条件;所述HAVING关系优化处理单元,用于优化HAVING关系;所述链接关系优化处理单元,用于优化链接关系;所述SELECT关系优化处理单元,用于优化SELECT关系;所述排序规则优化处理单元,用于优化排序规则。
与现有技术相比,本发明具有以下优点1、本发明通过自动化的对SELECT SQL进行优化处理,达到使其最快的执行、占用最少的数据库资源的效果,减少数据库资源的消耗,从而提高整个查询过程的效率。
2、本发明在优化过程中能够自动的进行冗余的关联关系和语法树的逻辑关系的优化,提高了优化的速度,优化效率高。


图1是本发明的方法实施例1流程图;图2是本发明的方法实施例2流程3a是本发明的方法实施例2语法树;图3b是本发明的方法实施例2关系代数语法树;图3c是本发明的方法实施例2优化后的关系代数语法树;图4a是本发明的装置实施例框图;图4b是本发明的装置实施例的冗余处理单元框图;图4c是本发明的装置实施例的优化处理单元框图。
具体实施例方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式
对本发明作进一步详细的说明。
在关系型数据库中,查询是使用的比较多的功能,在现在的查询语言中,用户只需要提出“做什么”,而不需要告诉“怎么做”,而具体的查询的实现都交于数据库系统处理,节约了编程的时间,但也造成提交的查询语句不够优化,存在着冗余的各种操作关系,以至于查询执行的效率低、占用数据库的资源,影响整个应用系统的正常运行。
参见图1,是本发明的方法实施例1流程图,包括步骤101,规范处理SELECT SQL中的字段名及别名。
在实际有人工手写或者由O-R Mapping系统生成的SELECT SQL中,经常存在着字段名和别名不规范的问题,影响查询的优化,所以要先规范处理好这些字段名和别名的表示方法。例如,将没有标识表名的字段替换为“原始表名.原始字段名”或者“原始表别名.原始字段名”的形式,如,
SELECT name FROM t1″O″可以规范为SELECT ″O″.name FROM t1″O″。
所述规范处理过程通过实现预置的规范表实现即可,也可以通过预置一定的转换数据操作而实现。例如,将所有的表名、列名统一转换为大写,预防不同数据库带来的大小写敏感;对表名、列名自动加上转义符,从而保证不会因为与数据库关键字冲突导致SQL出错。
步骤102,去掉所述SELECT SQL中的冗余的关联关系。
常见的冗余的关系有SELECT SQL的多余的连接关系、多余的条件关系和多余的参加运算的列,这些冗余造成了无用的运算,耗费了数据库系统的资源,降低的执行效率,可以通过逻辑分析识别出这些冗余关系,并去除这些冗余关系。而逻辑分析的策略可以预置在用于优化的程序代码中。
步骤103,将所述SELECT SQL转换为语法树。
将所述SELECT SQL转换为语法树后,可以采用关系代数运算来表示其逻辑关系。
步骤104,将所述语法树进行逻辑关系优化。
根据查询优化准则和关系代数的等价变换原则对语法树的逻辑关系进行优化。由于本发明中涉及的一些SQL语句为本领域技术人员熟知的,并且翻译为中文存在不准确的瑕疵,所以下面基本通过英文的形式加以介绍。
所述查询优化准则可以包括下面的优化策略(1)选择运算应尽可能先做。
在优化策略中这是最重要、最基本的一条。它常常可使执行时节约几个数量级,因为选择运算一般使计算的中间结果的数量大大变小,减少了后续运算的数据量。
(2)在执行连接运算前对关系适当地预处理。
预处理方法主要有两种索引连接方法、排序合并(SORT-MERGE)连接方法。
所述索引连接方法是在连接属性上建立索引,然后执行连接。
所述排序合并连接方法是对关系排序,然后执行连接。
(3)把投影运算和选择运算同时进行。
如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系。
(4)把投影同其前或其后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系。
(5)把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算,特别是等值连接运算要比同样关系上的笛卡尔积省很多时间。
(6)找出公共子表达式。
如果某个子表达式重复出现,且结果不是很大的关系,并且从外存中读人这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式并把结果写人中间文件是合算的。当查询的是视图时,定义视图的表达式就是公共子表达式的情况。
优化策略中大部分都涉及到关系代数表达式的变换。关系代数表达式的优化是查询优化的基本课题。研究关系代数表达式的优化可以从研究关系表达式的等价变换规则开始。
两个关系表达式E1和E2是等价的,可记为E1≡E2。
所述关系代数的等价变换原则可以包括(1)连接、笛卡尔积交换律。
设E1和E2是关系代数表达式,F是连接运算的条件,则有E1×E2≡E2×E1 (2)连接、笛卡尔积结合律。
设E1、E2、E3是关系代数表达式,F1和F2是连接运算的条件,则有(E1×E2)×E3≡(E1×E2)×E3
(3)投影的串接定律。
πA1,A2,...,An(πB1,B2,...,Bm(E))≡πA1,A2,...,An(E)这里E是关系代数表达式,Ai(i=1,2,...,n),Bj(j=1,2,..,m)是属性名且{A1,A2,...,An}构成{B1,B2,...,Bm}的子集。
(4)选择的串接定律。
σF1(σF2(E))≡σF1F2(E)这里E是关系代数表达式,F1和F2是选择条件。
串接定律说明选择条件可以合并,这样扫描一遍就可以检测全部条件。
(5)选择与投影的交换律。
σF(πA1,A2,...,An(E))≡πA1,A2,...,An(σF(E))如果选择条件F只涉及属性A1,A2,...,An。若F中有不属于A1,A2,...,An的属性B1,B2,...,Bn,则有πA1,A2,...,An(σF(E))≡πA1,A2,...,An(σF(πA1,A2,...,An,B1,B2,...,Bm(E))(6)选择与笛卡尔积的交换律。
如果F中涉及的属性都是E1中的属性,则有σF(E1×E2)≡σF(E1)×E2如果F=F1F2,并且F1只涉及E1中的属性,F2只涉及E2中的属性,则可推出σF(E1×E2)≡σF1(E1)×σF2(E2)若F1只涉及E1中的属性,F2只涉及E1和E2两者的属性,仍有σF(E1×E2)≡σF2(σF1(E1)×E2)使得部分选择在笛卡尔积前先做。
(7)、选择与并的交换。
设E=E1∪E2,E1,E2有相同的属性名,则有σF(E1∪E2)≡σF(E1)∪σF(E2)(8)选择与差运算的交换。
若E1,E2有相同的属性名,则有σF(E1-E2)≡σF(E1)-σF(E2)(9)、投影与笛卡尔积的交换。
设E1,E2是两个关系表达式,A1,A2,...,An是E1的属性,B1,B2,...,Bn是E2的属性,则有πA1,A3,...,An,B1,B3,...,Bm(E1×E2)≡πA1,A3,...,An(E1)×πB1,B2,...,Bm(E2)(10)投影与并交的交换。
若E1,E2有相同的属性名,则有πA1,A2,...,An,B1,B2,...,Bm(E1∪E2)≡πA1,A3,...,An(E1)∪πA1,A3,...,An(E2)步骤105,将优化后的语法树转化为标准SELECT SQL。
经过此步骤生成的SELECT SQL是优化后的查询语句。
优选的,所述去掉所述SELECT SQL中的冗余的关联关系是去除冗余的列、去除冗余的JOIN关系(链接关系)或者去除冗余的WHERE关系(查询条件)。举例如下。
优化例1。
原SQLSELECT″A″.nameFROMt1 AS″A″LEFT JOIN t2″B″ON″A″.id=″B″.idLEFT JOIN t3″C″
ON ″A″.id=″C″.idJOIN的关联A.id->B.idA.id->C.id因为SELECT中只用到了表A的name字段,也就是说B.id以及C.id的关联是多余的。
所以可以优化为SELECT″A″.Name FROM T1″A″优化例2。
原SQLSELECT a.dataFROM aLEFT OUTER JOIN bON a.fid=b.fidWHERE b.fid=0AND c.fnum=0JOIN的关联id->B.idWHERE条件b.fid=0c.fnum=0因为过滤条件已经对b.fid有限制,所以JOIN中关联是多余的。优化为SELECT a.data FROM a WHERE(a.fid=0 AND c.fnum=0)优化例3。
SELECT″O″.name″NUM″FROM t1″O″LEFT OUTER JOIN t2″B″ON″A″.id=″B″.idLEFT JOIN t3″C″
ON″B″.id=″C″.idWHERE ″C″.num=123分析如下,关联条件A.id->B.idB.id->C.id过滤条件为C.num查询列为O.name根据关联关系可以得出B表冗余,即关联关系替换为A.id->C.id。由于C.num为过滤条件,所以不能去掉C的关联。
优化结果为SELECT″O″.name″NUM″FROM t1″O″LEFT OUTER JOIN t3″C″ON″A″.id=″C″.idWHERE″C″.num=123如果优化例3的SQL变为SELECT″O″.name″NUM″FROM t1″O″LEFT OUTER JOIN t2″B″ON″A″.id=″B″.idLEFT JOIN t3″C″ON″B″.id=″C″.id那么优化结果为SELECT″O″.name″NUM″FROM t1″O″优选的,所述对语法树进行优化是优化所述语法树中的GROUP BY关系(分组条件)、HAVING关系、JOIN关系(链接关系)、SELECT关系或ORDER BY关系(排序规则)。
可以根据查询优化准则和关系代数的等价变换原则对语法树的逻辑关系进行优化,其优化的对象可以是GROUP BY关系、HAVING关系、JOIN关系、SELECT关系或ORDER BY关系。所述的优化规则可以预置在用于优化的查询模块中。
参照图2,是本发明的方法实施例2流程图,本实施例以一个具体的SELECTSQL为例,进一步说明优化过程,本实施例的数据库中包含两个表,学生表Student和学生选课表SC,Student包含学生姓名Sname和学生编号Sno字段,SC包含学生编号Sno和课程编号Cno字段,假定Student中有1000个学生记录,SC中有10000个选课记录,其中选修2号课程的选课记录为50个。
求选修了2号课程的学生姓名。原始SELECT SQL为SELECT SnameFROM Student,SC“S”JOIN Student ON Student.Sno=SC.SnoWHERE Student.Sno=SC.Sno AND SC.Cno=′2′步骤201,规范处理字段名及别名。
由原始SELECT SQL可见,“SELECT Sname”中的“Sname”不规范,缺少表名,应该写为“Student.Sname”;别名“S”其实并没有用到,可以去掉。
经过规范处理后的SELECT SQL为SELECT Student.SnameFROM Student.SCJOIN Student ON Student.Sno=SC.SnoWHERE Student.Sno=SC.Sno AND SC.Cno=′2′步骤202,去掉所述SELECT SQL中的冗余的JOIN关系。
在上述SELECT SQL中的“JOIN Student ON Student.Sno=SC.Sno”和“WHEREStudent.Sno=SC.Sno AND SC.Cno=′2′”中的条件“Student.Sno=SC.Sno”重复,可以去掉“JOIN Student ON Student.Sno=SC.Sno”。得到SELECT Student.SnameFROM Student,SCWHERE Student.Sno=SC.Sno AND SC.Cno=′2′步骤203,转换为语法树。
按照逻辑规则将上面步骤中SELECT SQL转换为语法树,参见图3a,是转换后的语法树,具体包括,把Student表和SC表以Student.Sno=SC.Sno做连接,在结果中选择出符合条件SC.Cno=′2′的学生的姓名Student.Sname。
步骤204,转换为关系代数语法树。
按照关系代数的逻辑关系将上面步骤中的语法树转换为关系代数语法树,参见图3b,是转换后的关系代数语法树,具体包括,把S tudent和SC以Student.Sno=SC.Sno做笛卡尔积,在结果中选择出符合条件SC.Cno=′2′的记录的Student.Sname属性值。
步骤205,进行优化。
根据查询优化准则和关系代数的等价变换原则对关系代数语法树的逻辑关系进行优化,把关系代数语法树转换成优化的形式。把选择σSC.Cno=′2′移到叶端,参见3c,是优化后的关系代数语法树,具体包括,以SC.Cno=′2′为条件,选择出SC中的记录,把结果以Student.Sno=SC.Sno条件和Student做笛卡尔积,选择其中的Student.Sname属性值。
步骤206,将优化后的语法树转化为标准SELECT SQL。得到优化后的SELECT SQL为SELECT Student.SnameFROM Student,SELECT SC.Sno FROM SC WHERE SC.Cno=′2′WHERE Student.Sno=SC.Sno本实施例中,通过优化JOIN关系,得到优化后的SELECT SQL,对于GROUPBY关系、HAVING关系、SELECT关系或ORDER BY关系的优化和此类似,作为本领域技术人员容易理解,在此不作赘述。
参见图4a,是本发明的装置实施例1框图,包括规范处理单元401,用于规范处理SELECT SQL中的字段名及别名;冗余处理单元402,用于去掉所述SELECT SQL中的冗余的关联关系;第一转换单元单元403,用于将所述SELECT SQL转换为语法树;优化处理单元404,用于将所述语法树进行逻辑关系优化;第二转换单元单元405,用于将优化后的语法树转化为标准SELECT SQL。
优选的,参见图4b,是本发明的装置实施例的冗余处理单元402框图,包括冗余列处理单元4011,用于去除冗余的列;或者,冗余JOIN关系处理单元4012,用于去除冗余的JOIN关系;或者,冗余WHERE关系处理单元4013,用于去除冗余的WHERE关系。
优选的,参见图4c,是本发明的装置实施例的优化处理单元404框图,包括GROUP BY关系优化处理单元4041,或者,HAVIN关系优化处理单元4042,或者,JOIN关系优化处理单元4043,或者,SELECT关系优化处理单元4044,或者,ORDER BY关系优化处理单元4045;所述GROUP BY关系优化处理单元4041,用于优化GROUP BY关系;所述HAVIN关系优化处理单元4042,用于优化HAVING关系;所述JOIN关系优化处理单元4043,用于优化JOIN关系;所述SELECT关系优化处理单元4044,用于优化SELECT关系;所述ORDER BY关系优化处理单元4045,用于优化ORDERBY关系。
以上对本发明所提供的一种对查询SQL请求进行优化的方法及装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
权利要求
1.一种对查询SQL请求进行优化的方法,其特征在于,包括,规范处理查询SQL语句中的字段名及别名;去掉所述S查询SQL语句中的冗余的关联关系;将所述查询SQL语句转换为语法树;将所述语法树进行逻辑关系优化;将优化后的语法树转化为标准查询SQL语句。
2.根据权利要求1所述的方法,其特征在于,所述去掉所述查询SQL语句中的冗余的关联关系是去除冗余的列、去除冗余的链接关系或者去除冗余的查询条件。
3.根据权利要求1或2所述的方法,其特征在于,所述对语法树进行优化是优化所述语法树中的分组条件、HAVING关系、链接关系、SELECT关系或排序规则。
4.一种对查询SQL请求进行优化的装置,其特征在于,包括,规范处理单元,用于规范处理查询SQL语句中的字段名及别名;冗余处理单元,用于去掉所述查询SQL语句L中的冗余的关联关系;第一转换单元单元,用于将所述查询SQL语句转换为语法树;优化处理单元,用于将所述语法树进行逻辑关系优化;第二转换单元单元,用于将优化后的语法树转化为标准查询SQL语句。
5.根据权利要求4所述的方法,其特征在于,所述冗余处理单元包括冗余列处理单元,用于去除冗余的列;或者,冗余链接关系处理单元,用于去除冗余的链接关系;或者,冗余查询条件处理单元,用于去除冗余的查询条件关系。
6.根据权利要求4或5所述的方法,其特征在于,所述优化处理单元包括分组条件优化处理单元,或者,HAVING关系优化处理单元,或者,链接关系优化处理单元,或者,SELECT关系优化处理单元,或者,排序规则优化处理单元;所述分组条件优化处理单元,用于优化分组条件;所述HAVING关系优化处理单元,用于优化HAVING关系;所述链接关系优化处理单元,用于优化链接关系;所述SELECT关系优化处理单元,用于优化SELECT关系;所述排序规则优化处理单元,用于优化排序规则。
全文摘要
本发明公开了一种对查询SQL请求进行优化的方法和装置,其中所述方法包括规范处理查询SQL语句中的字段名及别名;去掉所述S查询SQL语句中的冗余的关联关系;将所述查询SQL语句转换为语法树;将所述语法树进行逻辑关系优化;将优化后的语法树转化为标准查询SQL语句。本发明通过自动化的对SELECT SQL进行优化处理,达到使其最快的执行、占用最少的数据库资源的效果,减少数据库资源的消耗,从而提高整个查询过程的效率。
文档编号G06F17/30GK101021874SQ20071008722
公开日2007年8月22日 申请日期2007年3月21日 优先权日2007年3月21日
发明者修斯研 申请人:金蝶软件(中国)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1