【技术实现步骤摘要】
本专利技术涉及一种改写SQL查询语句的方法,具体地说,是涉及一种利用链表来去除SQL查询语句中存在的恒条件的方法。
技术介绍
在日常应用中,数据库经常需要处理大规模的数据,查询是用户经常使用的操作,一个复杂的查询语句会使数据库系统进行大量繁琐的数据处理,如WHERE条件的复杂度能很大地影响数据库的查询速度。目前,公知的数据库查询优化技术都不能在语义级别消去复杂的WHERE恒条件,这样就导致了查询执行器在扫描表的每一行时都需要用WHERE条件进行筛选,从而大大增加了数据处理开销。若查询优化器能从语义判断上消去一些不必要的WHERE条件的话,执行器便会显著减少运行时间,提高系统的整体性能,故如何去除SQL查询语句中的恒条件是今后查询优化的关键。
技术实现思路
本专利技术的目的是提供一种去除SQL查询语句恒条件的方法,该方法根据查询语句来创建链表、合并链表,可在语义级别上有效地消去SQL查询语句的恒条件,显著降低数据库系统执行器的处理开销。为实现上述目的,本专利技术采用以下技术方案一种去除SQL查询语句恒条件的方法,它包括以下步骤创建链表步骤首先将CHECK约束和WHERE条件都转换成查询树的子树,其中,叶节点是CHECK约束和WHERE条件中的表达式节点,其他的节点是AND或者OR节点,然后对CHECK约束子树和WHERE条件子树进行后序遍历,遇到表达式节点则生成一个列属性链表;合并链表步骤在进行后序遍历过程中,遇到AND或者OR节点则合并该节点的子树的列属性链表;改写查询语句步骤在合并链表的过程中,若发现恒真或恒假条件,则将条件节点改写为TRUE或FALSE ...
【技术保护点】
一种去除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[中国|北京]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。