去除SQL查询语句恒条件的方法技术

技术编号:2836375 阅读:444 留言:0更新日期:2012-04-11 18:40
本发明专利技术是一种去除SQL查询语句恒条件的方法,包括创建链表、合并链表和改写查询语句三个步骤。它将CHECK约束和WHERE条件都转换成查询树的子树,叶节点是表达式节点,其他的节点是AND或者OR节点,对这两个子树进行后序遍历,遇到表达式节点则生成一个列属性链表,遇到AND或者OR节点则合并该节点的子树的列属性链表,在合并链表的过程中,若发现恒真或恒假条件,则将条件节点改写为TRUE或FALSE常量节点,若最后该子树的根节点被改写为TRUE,则WHERE条件可以去掉;若根节点被改写为FALSE,则该SQL查询可以直接改写为空查询。由于本发明专利技术在语义级别上有效地消去了SQL查询语句的恒条件,因而避免了无关紧要的查询处理,显著降低了数据库系统执行器对恒真恒假查询条件的处理开销。

【技术实现步骤摘要】

本专利技术涉及一种改写SQL查询语句的方法,具体地说,是涉及一种利用链表来去除SQL查询语句中存在的恒条件的方法。
技术介绍
在日常应用中,数据库经常需要处理大规模的数据,查询是用户经常使用的操作,一个复杂的查询语句会使数据库系统进行大量繁琐的数据处理,如WHERE条件的复杂度能很大地影响数据库的查询速度。目前,公知的数据库查询优化技术都不能在语义级别消去复杂的WHERE恒条件,这样就导致了查询执行器在扫描表的每一行时都需要用WHERE条件进行筛选,从而大大增加了数据处理开销。若查询优化器能从语义判断上消去一些不必要的WHERE条件的话,执行器便会显著减少运行时间,提高系统的整体性能,故如何去除SQL查询语句中的恒条件是今后查询优化的关键。
技术实现思路
本专利技术的目的是提供一种去除SQL查询语句恒条件的方法,该方法根据查询语句来创建链表、合并链表,可在语义级别上有效地消去SQL查询语句的恒条件,显著降低数据库系统执行器的处理开销。为实现上述目的,本专利技术采用以下技术方案一种去除SQL查询语句恒条件的方法,它包括以下步骤创建链表步骤首先将CHECK约束和WHERE条件都转换成查询树的子树,其中,叶节点是CHECK约束和WHERE条件中的表达式节点,其他的节点是AND或者OR节点,然后对CHECK约束子树和WHERE条件子树进行后序遍历,遇到表达式节点则生成一个列属性链表;合并链表步骤在进行后序遍历过程中,遇到AND或者OR节点则合并该节点的子树的列属性链表;改写查询语句步骤在合并链表的过程中,若发现恒真或恒假条件,则将条件节点改写为TRUE或FALSE常量节点,若最后该子树的根节点被改写为TRUE,则去掉WHERE条件;若根节点被改写为FALSE,则将该SQL查询直接改写为空查询。本专利技术的优点是由于在语义级别上有效地消去了SQL查询语句的恒条件,因而避免了无关紧要的查询处理,显著降低了数据库系统执行器对恒真恒假查询条件的处理开销。附图说明图1是本专利技术方法流程简图;图2是CHECK约束和WHERE条件转换后的树结构示意图;图3是结构体的构成示意图;图4是列属性链表和区间链表示意图;图5是创建链表的流程图;图6是合并列属性链表的流程图;图7是用AND逻辑合并区间链表的流程图;图8是用OR逻辑合并区间链表的流程图;图9是本专利技术的一个实施例示意图;图10是优化查询语句的一般流程。具体实施例方式在OSCAR数据库中,parser语法解析子模块将字符串形式的SQL查询语句转换成一个parse tree结构,然后analyze语义分析子模块将parse tree结构转换成内部识别的Query查询树结构,SQL语句的不同部分转换成了查询树的各个子树,接下来Optimizer查询优化模块对Query结构进行优化,生成执行计划Plan,提交给Executer执行器模块执行得到查询结果。本专利技术位于Optimizer模块中基于规则的优化子模块中。本专利技术方法包括图1所示的三个步骤创建链表、合并链表和改写查询语句。本专利技术首先将CHECK约束和WHERE条件都转换成查询树的子树,表达式的树结构如图2所示,叶节点是表达式节点,如“列=1”、“列IS NOT NULL”等等,其他的节点是AND或者OR节点。本专利技术对这两个子树进行后序遍历,遇到表达式节点则生成一个列属性链表,遇到AND或者OR节点则合并该节点的子树的列属性链表,在合并链表的过程中,若发现恒真或恒假条件,则将条件节点改写为TRUE或FALSE常量节点。若最后该子树的根节点被改写为TRUE,则WHERE条件可以去掉;若根节点被改写为FALSE,则该SQL查询可以直接改写为空查询。本专利技术对CHECK约束和WHERE条件的树结构进行后序遍历,遇到表达式节点就创建列属性链表,遇到AND或OR节点就合并链表并改写查询语句,这个递归的过程一直持续到遍历完树中每个节点。因为在CHECK约束和WHERE条件的树结构中,叶节点都是表达式节点,其他的节点都是AND或OR节点,因此采用后序遍历能确保对于AND或OR连接的各个表达式,先分别生成它们的列属性链表,再根据AND或OR语义合并成一个链表。下面结合附图对本专利技术方法作详细说明。一.创建链表步骤本专利技术的第一步骤创建链表,是指遍历CHECK约束和WHERE条件时,对遇到的每个表达式创建结构体ExprListNode,并由该结构体生成一个单节点的列属性链表。如图3所示,结构体ExprListNode有四个域(1)col列名;(2)is_nullCHECK约束和WHERE条件中有没有对该列的IS NULL约束;(3)is_not_nullCHECK约束和WHERE条件中有没有对该列的IS NOT NULL约束;(4)exprFieldList列的区间链表,区间链表的每个节点为一ExprField结构体,每个节点表示该列在CHECK约束和WHERE条件语句中出现的一个区间,节点间的关系体现为区间之间的OR连接。结构体ExprField也有四个域(1)minnum区间的左边界;(2)maxnum区间的右边界(3)left_is_close左边界是否为闭区间;(4)right_is_close右边界是否为闭区间。依照上述结构体ExprListNode和结构体ExprField的定义,对CHECK约束和WHERE条件语句中出现的每个表达式分别创建结构体ExprListNode和结构体ExprField,然后将结构体ExprField链接到结构体ExprListNode的exprFieldList域中,如图4所示的若干列属性链表和区间链表实例,区间链表是列属性链表的exprFieldList域中所挂的链表。创建链表的具体流程如图5所示,包括步骤1、创建结构体ExprListNode,is_null和is_not_null域赋初值为FALSE,exprFieldList域赋初值为空链表。将表达式中的列提取出来赋值给ExprListNode的col域。2、如果表达式是IS NULL或者IS NOT NULL约束,则将ExprListNode结构体中对应的域赋值为TRUE,转到5。3、如果表达式是(列 操作符 常数),则创建ExprField结构体ExprField1,ExprField1的minnum和maxnum域赋初值为空指针NULL,left_is_close和right_is_close域赋初值为FALSE。4、判断表达式的操作符(a)若是列=常数con,表示为区间[con,con],则ExprField1各个域赋值为(con,con,TRUE,TRUE),用ExprField1生成单个节点的链表,赋值给ExprListNode结构体的exprFieldList域,转到5;(b)若是列<常数con,表示为区间(-∞,con),则ExprField1各个域赋值为(NULL,con,FALSE,FALSE),用ExprField1生成单个节点的链表,赋值给ExprListNode结构体的exprFieldList域,转到5;(c)若是列<=常数con,表示为区间(-∞,con],则ExprField1各个域赋值为(NULL,con,FALSE,TRU本文档来自技高网...

【技术保护点】
一种去除SQL查询语句恒条件的方法,其特征在于它包括步骤:创建链表步骤:首先将CHECK约束和WHERE条件都转换成查询树的子树,其中,叶节点是CHECK约束和WHERE条件中的表达式节点,其他的节点是AND或者OR节点,然后对CH ECK约束子树和WHERE条件子树进行后序遍历,遇到表达式节点则生成一个列属性链表;合并链表步骤:在进行后序遍历过程中,遇到AND或者OR节点则合并该节点的子树的列属性链表;改写查询语句步骤:在合并链表的过程中,若发现恒真或 恒假条件,则将条件节点改写为TRUE或FALSE常量节点,若最后该子树的根节点被改写为TRUE,则去掉WHERE条件;若根节点被改写为FALSE,则将该SQL查询直接改写为空查询。

【技术特征摘要】
1.一种去除SQL查询语句恒条件的方法,其特征在于它包括步骤创建链表步骤首先将CHECK约束和WHERE条件都转换成查询树的子树,其中,叶节点是CHECK约束和WHERE条件中的表达式节点,其他的节点是AND或者OR节点,然后对CHECK约束子树和WHERE条件子树进行后序遍历,遇到表达式节点则生成一个列属性链表;合并链表步骤在进行后序遍历过程中,遇到AND或者OR节点则合并该节点的子树的列属性链表;改写查询语句步骤在合并链表的过程中,若发现恒真或恒假条件,则将条件节点改写为TRUE或FALSE常量节点,若最后该子树的根节点被改写为TRUE,则去掉WHERE条件;若根节点被改写为FALSE,则将该SQL查询直接改写为空查询。2.根据权利要求1所述的去除SQL查询语句恒条件的方法,其特征在于在所述创建链表步骤中,遍历CHECK约束和WHERE条件时,对遇到的每个表达式节点创建一结构体ExprListNode,并由该结构体生成一个单节点的列属性链表。3.根据权利要求2所述的去除SQL查询语句恒条件的方法,其特征在于所述结构体ExprListNode有四个域(1)col列名;(2)is_nullCHECK约束和WHERE条件中有没有对该列的IS NULL约束;(3)is_not_nullCHECK约束和WHERE条件中有没有对该列的IS NOT NULL约束;(4)exprFieldList列的区间链表,区间链表的每个节点为一ExprField结构体,每个节点表示该列在CHECK约束和WHERE条件语句中出现的一个区间,节点间的关系体现为区间之间的OR连接,该结构体ExprField也有四个域(1)minnum区间的左边界;(2)maxnum区间的右边界;(3)left_is_close左边界是否为闭区间;(4)right_is_close右边界是否为闭区间。4.根据权利要求3所述的去除SQL查询语句恒条件的方法,其特征在于所述创建链表的步骤是步骤(1)创建结构体ExprListNode,对is_null和is_not_null域赋初值FALSE,exprFieldList域赋初值为空链表,将表达式中的列提取出来赋值给col域;步骤(2)如果表达式是IS NULL或者IS NOT NULL约束,则将ExprListNode结构体中对应的域赋值为TRUE,转到步骤(5);步骤(3)如果表达式是列+操作符+常数,则创建ExprField结构体ExprField1,ExprField1的minnum和maxnum域赋初值为空指针NULL,left_is_close和right_is_close域赋初值为FALSE;步骤(4)判断表达式的操作符(a)若是列=常数con,表示为区间[con,con],则ExprField1各个域赋值为(con,con,TRUE,TRUE),用ExprField1生成单个节点的链表,赋值给ExprListNode结构体的exprFieldList域,转到步骤(5);(b)若是列<常数con,表示为区间(-∞,con),则ExprField1各个域赋值为(NULL,con,FALSE,FALSE),用ExprField1生成单个节点的链表,赋值给ExprListNode结构体的exprFieldList域,转到步骤(5);(c)若是列<=常数con,表示为区间(-∞,con],则ExprField1各个域赋值为(NULL,con,FALSE,TRUE),用ExprField1生成单个节点的链表,赋值给ExprListNode结构体的exprFieldList域,转到步骤(5);(d)若是列>常数con,表示为区间(con,+∞),则ExprField1各个域赋值为(con,NULL,FALSE,FALSE),...

【专利技术属性】
技术研发人员:高鹏冯柯张淑锋顾云苏乔典李阳何清法蒋旭孙静元郭毅
申请(专利权)人:北京神舟航天软件技术有限公司
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1