CN107315744A - 一种数据查询方法及装置 - Google Patents
一种数据查询方法及装置 Download PDFInfo
- Publication number
- CN107315744A CN107315744A CN201610264975.4A CN201610264975A CN107315744A CN 107315744 A CN107315744 A CN 107315744A CN 201610264975 A CN201610264975 A CN 201610264975A CN 107315744 A CN107315744 A CN 107315744A
- Authority
- CN
- China
- Prior art keywords
- condition
- data
- subquery
- target
- operator
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2453—Query optimisation
- G06F16/24534—Query rewriting; Transformation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明实施例公开了一种数据查询方法及装置,该方法包括:接收数据查询请求,该数据查询请求包含查询条件,判断查询条件中是否包含预设运算符,若为是,则按照预设的查询条件优化规则,将查询条件变换为至少两个不包含预设运算符的子查询条件,根据子查询条件,从预设表中查询数据,根据查询到的数据,生成数据查询结果。应用本发明实施例,提高了数据库的数据查询性能,同时提高了数据查询速度。
Description
技术领域
本发明涉及数据库技术领域,特别涉及一种数据查询方法及装置。
背景技术
当前有非常多的SQL(Structured Query Language,结构化查询语言)优化方法,如:谓词下推、常量折叠等。但这些方法都是非常通用的优化方法,并且偏向保守的优化方法,大多都只是在执行的计划上做较小程度的调整进而达到优化数据查询的目的。
然而在实际应用中,数据查询中常常包含一些具体特征,对于这类数据查询,上述优化方法并不能对其进行优化,只能采用保守的方法来进行数据查询,如以下的SQL语句:
select*
from A,X
where
(A.a='a0'and X.x='x0')
or
(A.a='a1'and X.x='x1')
在执行过程中,由于该语句中包含括号、and和or,SQL数据库并不能对其进行谓词下推或采用其他优化方法对其进行优化,因此,为了获得查询结果,会对表A和表X做一个笛卡尔积(Cartesian product)运算,然后在笛卡尔积运算的基础上,按照条件“(A.a='a0'and X.x='x0')or(A.a='a1'and X.x='x1)”进行过滤并得到需要的查询结果。
根据上述方法,笛卡尔积运算产生的结果数为num(A)*num(X),其中,num(A)为表A的行数,num(X)为X表的行数。当表A和表X达到一定规模后,这个笛卡尔积运算的结果将是一个规模巨大的结果集合,并占用查询终端大量的内存,进而影响了数据库的数据查询性能,查询速度慢。
发明内容
本发明实施例公开了一种数据查询方法及装置,以提高数据库的数据查询性能,提高数据查询速度。
为达到上述目的,本发明实施例公开了一种数据查询方法,所述方法包括步骤:
接收数据查询请求,其中,所述数据查询请求包含查询条件;
判断所述查询条件中是否包含预设运算符;
若为是,则按照预设的查询条件优化规则,将所述查询条件变换为至少两个不包含所述预设运算符的子查询条件;
根据所述子查询条件,从预设表中查询数据,其中,所述预设表,用于存储数据;
根据查询到的数据,生成数据查询结果。
在本发明的一种实现方式中,所述按照预设的查询条件优化规则,将所述查询条件变换为至少两个不包含所述预设运算符的子查询条件,包括:
将所述查询条件设置为目标查询条件;
以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件;
在变换得到的目标子查询条件中不包含预设运算符的情况下,将不包含预设运算符的目标子查询条件确定为所述查询条件的一个子查询条件;
在变换得到的目标子查询条件中包含预设运算符的情况下,将包含预设运算符的目标子查询条件设置为目标查询条件,返回所述以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件的步骤。
在本发明的一种实现方式中,所述以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件,包括:
以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件,并获得目标子查询条件之间的运算关系;
所述根据查询到的数据,生成数据查询结果,包括:
根据所述目标子查询条件之间的运算关系,确定查询到的数据间的运算关系;
根据查询到的数据和所确定的运算关系,生成数据查询结果。
在本发明的一种实现方式中,所述根据所述子查询条件,从预设表中查询数据,包括:
根据预设表的数据索引,从所述预设表中获得满足所述子查询条件的数据。
在本发明的一种实现方式中,所述预设的查询条件优化规则包括:谓词下推、常量折叠、布尔函数简化中的一种或多种。
为达到上述目的,本发明实施例还公开了一种数据查询装置,所述装置包括:请求接收模块、运算符判断模块、条件变换模块、数据查询模块和结果生成模块;
其中,所述请求接收模块,用于接收数据查询请求,其中,所述数据查询请求包含查询条件;
所述运算符判断模块,用于判断所述查询条件中是否包含预设运算符,若为是,则触发所述条件变换模块;
所述条件变换模块,用于按照预设的查询条件优化规则,将所述查询条件变换为至少两个不包含所述预设运算符的子查询条件;
所述数据查询模块,用于根据所述子查询条件,从预设表中查询数据,其中,所述预设表,用于存储数据;
所述结果生成模块,用于根据查询到的数据,生成数据查询结果。
在本发明的一种实现方式中,所述条件变换模块,包括:第一条件设置子模块、条件变换子模块、条件确定子模块和第二条件设置子模块;
其中,所述第一条件设置子模块,用于将所述查询条件设置为目标查询条件;
所述条件变换子模块,用于以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件;
所述子条件确定子模块,用于在变换得到的目标子查询条件中不包含预设运算符的情况下,将不包含预设运算符的目标子查询条件确定为所述查询条件的一个子查询条件;
所述第二条件设置子模块,用于在变换得到的目标子查询条件中包含预设运算符的情况下,将包含预设运算符的目标子查询条件设置为目标查询条件,并触发所述条件变换子模块,以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件。
在本发明的一种实现方式中,所述条件变换子模块,具体用于:
以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件,并获得目标子查询条件之间的运算关系;
所述结果生成模块,包括:运算关系确定子模块和结果生成子模块;
其中,所述运算关系确定子模块,用于根据所述目标子查询条件之间的的运算关系,确定查询到的数据间的运算关系;
所述结果生成子模块,用于根据查询到的数据和所确定的运算关系,生成数据查询结果。
在本发明的一种实现方式中,所述数据查询模块,具体用于:
根据预设表的数据索引,从所述预设表中获得满足所述子查询条件的数据。
在本发明的一种实现方式中,所述预设的查询条件优化规则包括:谓词下推、常量折叠、布尔函数简化中的一种或多种。
由上可知,在本发明实施例中,查询终端在接收到数据查询请求后,判断该数据查询请求中包含的查询条件中是否包含预设运算符,在包含预设运算符的情况下,按照预设的查询条件优化规则,将查询条件变换为至少两个不包含预设运算符的子查询条件,根据变换得到的子查询条件,从预设表中查询数据,根据查询到的数据,生成数据查询结果。因为,子查询条件中不包含预设运算符,这样在进行数据查询时,就可以避免因这些运算符而造成的大数据量的运算(例如笛卡尔积运算),进而避免占用查询终端大量的内存,提高了数据库的数据查询性能,进而提高了数据查询速度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种数据查询方法的流程示意图;
图2为本发明实施例提供的另一种数据查询方法的流程示意图;
图3(a)为一个SQL语句的逻辑计划树的结构示意图;
图3(b)为一个SQL语句的物理计划树的结构示意图;
图4(a)为本发明实施例提供的等价后的逻辑计划树的结构示意图;
图4(b)为本发明实施例提供的等价后的物理计划树的结构示意图;
图5(a)为优化前的逻辑计划树的结构示意图;
图5(b)为优化后的逻辑计划树的结构示意图;
图6为本发明实施例提供的一种数据查询装置的结构示意图;
图7为本发明实施例提供的另一种数据查询装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面通过具体实施例,对本发明进行详细说明。
参考图1,图1为本发明实施例提供的一种数据查询方法的流程示意图,该方法包括如下步骤:
S101:接收数据查询请求;
其中,数据查询请求可以包含查询条件,可以理解的查询条件一般包括运算符、操作数等元素,其中,运算符可以包括和(and)、或(or)等。
假设,用户需要查询表A的a列中取值为’a0’并且表B的b列中取值为’b0’的数据,和表A的a列中取值为’a1’并且表B的b列中取值为’b1’的数据,那么数据查询请求中包含的查询条件为:(A.a='a0'and B.b='b0')or(A.a='a1'and B.b='b1')。
在本发明的一种实现方式中,数据查询请求中还可以包含:需要表(如上述假设中的表A和表B)所在目标存储终端的标识,以便查询终端能够快速的获得目标存储终端中表中的数据。当然,数据查询请求中还可以包含其他信息,本发明对此不进行限定。
S102:判断数据查询请求中包含的查询条件中是否包含预设运算符,若为是,则执行步骤S103;
这里,预设运算符为使得数据库不能采用优化方法查询数据的运算符,或者,占用大量内存的运算符。在本发明的一个实施例中,查询条件中如果包含某些运算符是不能进行优化处理的,如步骤S101中假设的查询条件中包含‘or’运算符,在进行数据查询时,如果查询条件中包含该运算符,则不能采用谓词下推的优化方法来进行数据查询,只能采用笛卡尔积方法来获得用户需要的数据,这样就会占用查询终端大量的内存,并且降低了数据库的数据查询性能,查询速度慢。因此,为了提高数据查询速度,需要判断查询条件中是否包含预设运算符,若包含预设运算符,则将该查询条件变换为多个子查询条件,使得子查询条件中不包含预设运算符。
在本发明的一种实现方式中,在查询条件中不包含预设运算符的情况下,可以直接采用谓词下推、常量折叠、布尔函数简化等常用的优化方法来查询数据,此处不再赘述。
S103:按照预设的查询条件优化规则,将查询条件变换为至少两个不包含预设运算符的子查询条件;
在本发明的一种实现方式中,上述预设的查询条件优化规则可以包括但不限于:谓词下推、常量折叠、布尔函数简化中的一种或多种。按照预设的查询条件优化规则,将查询条件变换为至少两个不包含预设运算符的子查询条件,可以包括但不限于:
将查询条件变换为至少两个不包含预设运算符的子查询条件,其中,每个子查询条件可以采用谓词下推、常量折叠、布尔函数简化中的一种或多种进行优化。
S104:根据子查询条件,从预设表中查询数据;
其中,预设表,用于存储数据。
假设,预设运算符为‘or’,则步骤S101中的查询条件(A.a='a0'and B.b='b0')or(A.a='a1'and B.b='b1')可以变换为2个子查询条件:(A.a='a0'and B.b='b0')和(A.a='a1'and B.b='b1'),这两个子查询条件中不包含预设运算符‘or’,因此,针对这两个子查询条件,可以采用谓词下推的优化方法来查询数据,仅拉取表A中的a列和表B中的b列的数据即可,而不必采用笛卡尔积方法拉取所有列的数据来获得需要的数据,从而提高了数据库的数据查询性能,同时提高了数据查询速度。
另外,在分布式系统中,数据可以分散的存储在各个存储终端中,在应用笛卡尔积方法进行数据查询时,可能需要以数据块的形式重复拉取一个表中的数据,假设,当前有表A和表X进行笛卡尔积运算,如果以表A为基准,则拉取总次数为:block(A)+num(A)*block(X),其中block(A)为表A的数据块数,block(X)为表X的数据块数,num(A)为表A的行数;同理以表X为基准,则拉取总次数为:num(X)*block(A)+block(X),num(X)为表X的行数,不管从哪边拉取,拉取的数据量都是巨大的,这极大的影响了数据库的数据查询性能,查询速度慢。然而在本发明实施例中,根据预设的查询条件优化规则将查询条件变换为至少两个子查询条件,子查询条件中不包含预设运算符,这样就可以根据子查询条件拉取需要的表中的列,减少了拉取的数据量,进一步提高了数据查询性能和数据查询速度。
在本发明的一种实现方式中,上述根据子查询条件,从预设表中查询数据,可以包括:
根据预设表的数据索引,从预设表中获得满足子查询条件的数据。
假设,子查询条件为A.a=’a0’,则可以根据表A的数据索引仅获得表A中a列中为’a0’的数据。这样不必获得一整列a的数据,进一步提高了数据库的数据查询性能,提高了数据查询速度。
S105:根据查询到的数据,生成数据查询结果。
在本发明的一种实现方式中,在根据子查询条件,从预设表中查询到数据后,可以根据查询条件中的连接各个子查询条件的运算符确定查询到的数据间的运算关系,进而根据确定的运算关系,整合查询到的数据,生成数据查询结果。
在本发明的一种实现方式中,可以将数据查询结果发送给预设终端,以便及时告知用户数据查询结果,当然,也可以在存储的数据查询结果的数量达到预设数量时,再发送给预设终端,避免影响用户对预设终端的正常使用。
应用图1所示实施例,查询终端在接收到数据查询请求后,判断该数据查询请求中包含的查询条件中是否包含预设运算符,在包含预设运算符的情况下,按照预设的查询条件优化规则,将查询条件变换为至少两个不包含预设运算符的子查询条件,根据变换得到的子查询条件,从预设表中查询数据,根据查询到的数据,生成数据查询结果。因为,子查询条件中不包含预设运算符,这样在进行数据查询时,就可以避免因这些运算符而造成的大数据量的运算(例如笛卡尔积运算),进而避免占用查询终端大量的内存,提高了数据库的数据查询性能,进而提高了数据查询速度。
参考图2,图2为本发明实施例提供的另一种数据查询方法的流程示意图,该方法中,步骤S103可以包括如下步骤:
S1031:将查询条件设置为目标查询条件;
S1032:以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件,并判断变换得到的目标子查询条件中是否不包含预设运算符,若为是,则执行步骤S1033,若为否,则执行步骤S1034;
S1033:将不包含预设运算符的目标子查询条件确定为查询条件的一个子查询条件;
在本发明的一种实现方式中,在将不包含预设运算符的目标子查询条件确定为查询条件的一个子查询条件后,将该子查询条件添加入该查询条件的一个子查询条件集中,以便根据子查询条件集中的每一子查询条件查询数据,并获得数据查询结果。
S1034:将包含预设运算符的目标子查询条件设置为目标查询条件,返回步骤S1032,以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件,并判断变换得到的目标子查询条件中是否不包含预设运算符。
在本发明的一种实施方式中,在以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件之后,在变换得到的目标子查询条件中不存在包含预设运算符的目标子查询的情况下,变换过程结束,此时确定的每一子查询条件都可以采用经过简单的运算即可查询数据,或者,采用谓词下推、常量折叠、布尔函数简化等优化方法来查询数据,而不是采用笛卡尔积方法等运算量过大的方法查询数据,因此不会产生过多的数据,占用查询终端大量的内存,提高了数据库的数据查询性能,进而提高了数据查询速度。
SQL数据库在进行数据查询时,查询条件中常常包含有运算符(and、or等),根据这些运算符对查询条件进行连接操作join,运算符为连接条件,在查询条件中包含连接条件的情况下,为了优化数据查询,需要尽量的将查询条件进行谓词下推。但是,对于一些包含特别的连接条件(例如:or)的查询条件,很多SQL数据库没法有效地对其进行谓词下推,这些特别的连接条件会“悬浮”在连接操作上面,进而导致SQL数据库会先通过做笛卡尔积运算再过滤数据来完成整个逻辑上的操作,参考图3(a)和图3(b),图3(a)为一个SQL语句的逻辑计划树的结构示意图,图3(b)为一个SQL语句的物理计划树的结构示意图。
在图3(a)和图3(b)中,Relation:表示拉取某个表的数据,指定条件时,表示只拉取符合条件的数据(图3(a)和图3(b)中左下方节点表示拉取表A的所有数据,图3(a)和图3(b)中右下方节点表示拉取表X的所有数据);
Join:表示对左右子节点做一个连接操作(该节点下方指定查询条件);
Project:表示对子节点做投影操作,对应SQL语句中的select关键字(该节点下方指定需要投影的列名,图3(a)和图3(b)上部Project节点下方的“*”表示需要投影所有的相关列);
Filter:表示对子节点做一个过滤操作(该节点下方指定了过滤条件);
Cartesian Product:表示对左右节点做笛卡尔积运算(图3(b)中表示对表A和表X做笛卡尔积运算,一般表示为A*X)。
从图3(a)和图3(b)中可以看出,在当前的SQL数据库中,由于Join的查询条件中Or下面有And表达式,使得整个查询条件无法下推,最终形成的物理计划是先拉取表A和表X两张表中所有数据,做笛卡尔积运算后,再在上层过滤,这种物理计划极其低效。为了提高物理计划的效率,本发明中的一种实现方式中,根据集合运算的方法对查询条件进行分解,进而对查询条件进行下推。
假设,有A、B、X、Y四个集合,则根据集合运算的分配律,下面公式成立:
A∩(X∪Y)=(A∩X)∪(A∩Y) (1)
A∪(X∩Y)=(A∪X)∩(A∪Y) (2)
进一步,把(A∪B)代入公式①中的A位置,则有如下等式成立:
(A∪B)∩(X∪Y)=(A∩X)∪(A∩Y)∪(B∩X)∪(B∩Y) (3)
同理把(A∩B)代入公式②中的A位置,则有如下运算过程成立:
(A∩B)∪(X∩Y)=(A∪X)∩(A∪Y)∩(B∪X)∩(B∪Y) (4)
上面等式的内涵是:带括号组合的交并运算,可以通过分解,调换交并运算的优先计算顺序。比如在公式(3)中,等式左边括号里层是∪运算,而括号外层是∩,通过等价变换后,等式右边括号里全部是∩运算,而括号外层是∪运算。公式(4)具有同样的道理。
根据上述方法,数据库中关系运算与集合运算具有对等性,假设,表A(a,b,c),表示表A中有a、b、c三列,现在要获得a列中值为‘a0’的数据,写成SQL语句有:
select*from A where a=’a0’
当把表A看做一个集合后,则上面SQL语句等价于:{Aa=’a0’},这表示对集合A进行过滤求子集,求子集的条件是a=’a0’。
进一步,假设要获得a=’a0’且b=’b0’的数据,写成SQL语句有:
select*from A where a=’a0’and b=’b0’ (5)
SQL语句(5)用集合的方法表示有:{Aa=’a0’and b=’b0’}。 (6)
上面的集合(6)表示对集合A进行过滤求子集,求子集的条件是:a=’a0’且b=’b0’。
进一步,按照集合的原理,完全可以先按条件a=’a0’对表A求子集得出表A1,然后按条件b=’b0’再对表A求子集得出表A2,然后对表A1与表A2求交集得出最终结果,整个过程可表示为:{Aa=’a0’}∩{Ab=’b0’}。 (7)
更进一步,假设intersect为SQL语句中的求交集关键字,则(7)可进一步用SQL语句等价表示为:
(select*from A where a=’a0’)intersect(select*from A where b=’b0’)(8)
由上分析可知,(5)、(6)、(7)、(8)四个表达式在原理上完全等价的。同理,下面四个表达式在原理上也完全等价:
select*from A where a=’a0’or b=’b0’ (9)
{Aa=’a0’or b=’b0’} (10)
{Aa=’a0’}∪{Ab=’b0’} (11)
(select*from A where a=’a0’)union(select*from A where b=’b0’) (12)
另外,SQL语句(12)中,假设union为SQL语句中的求并集关键字。
需要说明的是,在某些SQL数据库中,并不支持intersect、union、union all等关键字,可以采用其他类似的关键字代替,本发明对此不进行限定。
通过上面的等价性分析,揭示出了两层内涵:第一,可以从集合的观点的看待SQL语句中的数据操作,然后引入集合运算的各种运算法则进行变换,以达到优化SQL数据查询的目的;第二,SQL语句条件表达式中的and与or,可以提升为子SQL语句之间的交并运算(参考SQL语句(5)与(8),以及(9)与(12)两组表达式的等价性)。
根据集合运算的方法对查询条件进行分解,将查询条件下推到拉取表的操作(Relation节点)上,极大地提高了数据查询性能,假设,当前有SQL语句:
select*from A,X where(A.a=’a0’and X.x=’x0’)or(A.a=’a1’and X.x=’x1’)等价于:
select*from A,X where(A.a=’a0’and X.x=’x0’)
union
select*from A,X where(A.a=’a1’and X.x=’x1’)
也就是将查询条件{(A.a=’a0’and X.x=’x0’)or(A.a=’a1’and X.x=’x1’)}变换为(A.a=’a0’and X.x=’x0’)和(A.a=’a1’and X.x=’x1’)两个子查询条件,从而得到等价后的逻辑计划树和物理计划树,参考图4(a)和图4(b),图4(a)为本发明实施例提供的等价后的逻辑计划树的结构示意图,图4(b)为本发明实施例提供的等价后的物理计划树的结构示意图。
从图4(a)中可以看出,将查询条件变换后,获得的等价后的逻辑计划树中有两个Join连接操作,但每个Join操作里边的查询条件变得简单了,这种简单的查询条件进入到物理计划阶段,直接能将查询条件进行谓词下推,到了物理计划阶段,所有的查询条件都下推到了最低层,直接抽取表中的相关数据。这样的结果就是:在图4(b)中执行Relation操作抽取表中数据时过滤了大量不需要的数据,这极大加快了数据查询的速度,同时减少了后续Cartesian Product操作时牵涉的数据量,避免了占用太多查询终端的内存问题,从而提高了数据库的数据查询性能,提高了数据查询速度。
另外,由图4(b)可以看出,在发明实施例中,条件树和计划树是等价转换的,通过这种等价转换后,使得一些普通的优化方法简化地更彻底。
需要说明的是,在变换查询条件时,按照运算符的优先级从低到高的顺序变换,如:SQL语句:(A.a=’a0’and X.x=’x0’)or(A.a=’a1’and X.x=’x1’)中,’or’的优先级最低,因此首先以’or’为基准,将(A.a=’a0’and X.x=’x0’)or(A.a=’a1’and X.x=’x1’)作为目标查询条件,并将该目标查询条件变换为两个目标子查询条件,也就是(A.a=’a0’and X.x=’x0’)和(A.a=’a1’and X.x=’x1’)两个目标子查询条件,这样避免了因随意变换导致子查询条件间的运算关系混乱,进而不等获得正确的数据查询结果的问题。
另外,上述SQL语句变换后获得(A.a=’a0’and X.x=’x0’)和(A.a=’a1’and X.x=’x1’)两个目标子查询条件,此时这两个目标子查询条件都不包含预设运算符’or’,则可以将这两个目标子查询条件确定为子查询条件,若将A.a=’a0’替换为(A.a=’a0’or B.b=’b0’),则目标子查询条件(A.a=’a0’and X.x=’x0’)变为(A.a=’a0’or B.b=’b0’andX.x=’x0’),此时该目标子查询条件中包含预设运算符’or’,此时将该目标子查询条件确定为目标查询条件(在不加括号运算符的情况下,’and’比’or’的运算优先级高),将该目标查询条件变换为两个目标子查询条件,也就是(A.a=’a0’)和(B.b=’b0’and X.x=’x0’)两个目标子查询条件,此时这两个目标子查询条件都不包含预设运算符’or’,则可以将这两个目标子查询条件确定为子查询条件,若目标子查询条件还包含预设运算符’or’,则继续变换目标查询条件,直至目标子查询条件不再包含预设运算符’or’。
在本发明的一种实现方式中,以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件,可以包括:
以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件,并获得目标子查询条件之间的运算关系。
在本发明的一个实施例中,在变换目标查询条件时,获得目标子查询条件间的运算关系,以便于根据该运算关系确定查询到的数据间的运算关系,而不必在查询到数据后,去查询条件中获得查询到的数据间的运算关系,提高了数据查询速度。
在这种情况下,根据查询到的数据,生成数据查询结果,可以包括步骤:
S1、根据目标子查询条件之间的运算关系,确定查询到的数据间的运算关系;
在本发明的一种实现方式中,连接两个目标子查询条件间的运算符为’and’,这可以确定两个目标子查询条件间的运算关系为intersect(也可以为其他类似的关键字),连接两个目标子查询条件间的运算符为’or’,这可以确定两个目标子查询条件间的运算关系为union或union all(也可以为其他类似的关键字),如下:
select*from A where a='a0'and b='b0'等价于
(select*from A where a='a0')intersect(select*from A where b='b0'),
select*from X where x='x0'or y='y0'等价于
(select*from X where x='x0')union(select*from X where y='y0')。
在开源的SQL数据库中,当Join的查询条件中有OR的条件表达式,查询条件不能有效地进行谓词下推,执行如上变换非常有价值,如:
Join(left,right,Inner,Some(a or b))=>
Union(Join(left,right,Inner,Some(a)),Join(left,right,Inner,Some(b)))。
上面SQL语句表示,在左右子计划left、right上以条件a or b做内连接(InnerJoin),经过本发明实施例提供的技术方案对该SQL语句进行优化可以变换为分别以条件a和b在子计划left、right做内连接,然后再求并集,具体地,可参考图5(a)和图5(b),图5(a)为优化前的逻辑计划树的结构示意图,图5(b)为优化后的逻辑计划树的结构示意图。
从图5(a)和图5(b)可以看出,将a or b变换后,连接操作join下方的查询条件变得简单了,进而提高了数据查询的速度。当然,若a和/或b也是一个and和or的作何表达式,则可以继续变换下去,保证连接操作join下方的查询条件最为简单,能够有效的提高数据查询的速度,同时与谓词下推、常量折叠、布尔函数简化等常用的优化方法结合使用或迭代使用,能够进一步提高数据查询的速度。
S2、根据查询到的数据和所确定的运算关系,生成数据查询结果。
假设,当前有一查询条件A,经变换后获得A1和A2,A1和A2间的运算关系为intersect,确定根据A1和A2查询到的数据间的运算关系为intersect,此时A1确定为子查询条件,A2经变换后获得A21和A22,A21和A22间的运算关系为uinon,确定根据A21和A22查询到的数据间的运算关系为uinon,此时A21和A22确定为子查询条件,根据子查询条件A1、A21和A22查询到数据后,根据A21查询到数据和根据A22查询到数据按照union做运算后,获得的数据A2,数据A2和根据A1查询到数据按照intersect做运算后获得最终的数据,并生成数据查询结果。
应用图2所示实施例,查询终端将查询条件设置为目标查询条件,以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件,若存在不包含预设运算符的目标子查询条件,将变换得到的目标子查询条件中不包含预设运算符的目标子查询条件确定为查询条件的一个子查询条件,若存在包含预设运算符的目标子查询条件,将包含预设运算符的目标子查询条件设置为目标查询条件,再次变换该目标查询条件,直到不存在包含预设运算符的目标子查询条件为止,这样可以保证确定每一子查询条件都可以采用谓词下推、常量折叠、布尔函数简化等常用的优化方法或者经过简单运算就能实现查询数据,有效地提高了数据库的数据查询性能,进而提高了数据查询速度。
参考图6,图6为本发明实施例提供的一种数据查询装置的结构示意图,该装置可以包括:请求接收模块601、运算符判断模块602、条件变换模块603、数据查询模块604和结果生成模块605;
其中,请求接收模块601,用于接收数据查询请求,其中,数据查询请求包含查询条件;
运算符判断模块602,用于判断查询条件中是否包含预设运算符,若为是,则触发条件变换模块603;
条件变换模块603,用于按照预设的查询条件优化规则,将所述查询条件变换为至少两个不包含所述预设运算符的子查询条件;
这里,预设的查询条件优化规则可以包括:谓词下推、常量折叠、布尔函数简化中的一种或多种。
数据查询模块604,用于根据子查询条件,从预设表中查询数据,其中,预设表,用于存储数据;
在本发明的一种实现方式中,数据查询模块604具体可以用于:
根据预设表的数据索引,从预设表中获得满足子查询条件的数据。
结果生成模块605,用于根据查询到的数据,生成数据查询结果。
应用图6所示实施例,查询终端在接收到数据查询请求后,判断该数据查询请求中包含的查询条件中是否包含预设运算符,在包含预设运算符的情况下,按照预设的查询条件优化规则,将查询条件变换为至少两个不包含预设运算符的子查询条件,根据变换得到的子查询条件,从预设表中查询数据,根据查询到的数据,生成数据查询结果。因为,子查询条件中不包含预设运算符,这样在进行数据查询时,就可以避免因这些运算符而造成的大数据量的运算(例如笛卡尔积运算),进而避免占用查询终端大量的内存,提高了数据库的数据查询性能,进而提高了数据查询速度。
参考图7,图7为本发明实施例提供的另一种数据查询装置的结构示意图,该装置中,条件变换模块603可以包括:第一条件设置子模块6031、条件变换子模块6032、条件确定子模块6033和第二条件设置子模块6034;
其中,第一条件设置子模块6031,用于将查询条件设置为目标查询条件;
条件变换子模块6032,用于以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件;
条件确定子模块6033,用于在变换得到的目标子查询条件中不包含预设运算符的情况下,将不包含预设运算符的目标子查询条件确定为查询条件的一个子查询条件;
第二条件设置子模块6034,用于在变换得到的目标子查询条件中包含预设运算符的情况下,将包含预设运算符的目标子查询条件设置为目标查询条件,并触发条件变换子模块6032,以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件。
在本发明的一种实现方式中,条件变换子模块6032,具体可以用于:
以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件,并获得目标子查询条件之间的运算关系;
这种情况下,结果生成模块605,可以包括:运算关系确定子模块和结果生成子模块(图7中未示出);
其中,运算关系确定子模块,用于根据目标子查询条件之间的运算关系,确定查询到的数据间的运算关系;
结果生成子模块,用于根据查询到的数据和所确定的运算关系,生成数据查询结果。
应用图7所示实施例,查询终端将查询条件设置为目标查询条件,以目标查询条件中优先级最低运算符为基准,将目标查询条件变换为两个目标子查询条件,若存在不包含预设运算符的目标子查询条件,将变换得到的目标子查询条件中不包含预设运算符的目标子查询条件确定为查询条件的一个子查询条件,若存在包含预设运算符的目标子查询条件,将包含预设运算符的目标子查询条件设置为目标查询条件,再次变换该目标查询条件,直到不存在包含预设运算符的目标子查询条件为止,这样可以保证确定每一子查询条件都可以采用谓词下推、常量折叠、布尔函数简化等常用的优化方法或者经过简单运算就能实现查询数据,有效地提高了数据库的数据查询性能,进而提高了数据查询速度。
对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中,这里所称得的存储介质,如:ROM/RAM、磁碟、光盘等。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (10)
1.一种数据查询方法,其特征在于,所述方法包括步骤:
接收数据查询请求,其中,所述数据查询请求包含查询条件;
判断所述查询条件中是否包含预设运算符;
若为是,则按照预设的查询条件优化规则,将所述查询条件变换为至少两个不包含所述预设运算符的子查询条件;
根据所述子查询条件,从预设表中查询数据,其中,所述预设表,用于存储数据;
根据查询到的数据,生成数据查询结果。
2.根据权利要求1所述的方法,其特征在于,所述按照预设的查询条件优化规则,将所述查询条件变换为至少两个不包含所述预设运算符的子查询条件,包括:
将所述查询条件设置为目标查询条件;
以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件;
在变换得到的目标子查询条件中不包含预设运算符的情况下,将不包含预设运算符的目标子查询条件确定为所述查询条件的一个子查询条件;
在变换得到的目标子查询条件中包含预设运算符的情况下,将包含预设运算符的目标子查询条件设置为目标查询条件,返回所述以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件的步骤。
3.根据权利要求2所述的方法,其特征在于,所述以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件,包括:
以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件,并获得目标子查询条件之间的运算关系;
所述根据查询到的数据,生成数据查询结果,包括:
根据所述目标子查询条件之间的运算关系,确定查询到的数据间的运算关系;
根据查询到的数据和所确定的运算关系,生成数据查询结果。
4.根据权利要求1所述的方法,其特征在于,所述根据所述子查询条件,从预设表中查询数据,包括:
根据预设表的数据索引,从所述预设表中获得满足所述子查询条件的数据。
5.根据权利要求1所述的方法,其特征在于,所述预设的查询条件优化规则包括:谓词下推、常量折叠、布尔函数简化中的一种或多种。
6.一种数据查询装置,其特征在于,所述装置包括:请求接收模块、运算符判断模块、条件变换模块、数据查询模块和结果生成模块;
其中,所述请求接收模块,用于接收数据查询请求,其中,所述数据查询请求包含查询条件;
所述运算符判断模块,用于判断所述查询条件中是否包含预设运算符,若为是,则触发所述条件变换模块;
所述条件变换模块,用于按照预设的查询条件优化规则,将所述查询条件变换为至少两个不包含所述预设运算符的子查询条件;
所述数据查询模块,用于根据所述子查询条件,从预设表中查询数据,其中,所述预设表,用于存储数据;
所述结果生成模块,用于根据查询到的数据,生成数据查询结果。
7.根据权利要求6所述的装置,其特征在于,所述条件变换模块,包括:第一条件设置子模块、条件变换子模块、条件确定子模块和第二条件设置子模块;
其中,所述第一条件设置子模块,用于将所述查询条件设置为目标查询条件;
所述条件变换子模块,用于以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件;
所述条件确定子模块,用于在变换得到的目标子查询条件中不包含预设运算符的情况下,将不包含预设运算符的目标子查询条件确定为所述查询条件的一个子查询条件;
所述第二条件设置子模块,用于在变换得到的目标子查询条件中包含预设运算符的情况下,将包含预设运算符的目标子查询条件设置为目标查询条件,并触发所述条件变换子模块,以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件。
8.根据权利要求7所述的装置,其特征在于,所述条件变换子模块,具体用于:
以所述目标查询条件中优先级最低运算符为基准,将所述目标查询条件变换为两个目标子查询条件,并获得目标子查询条件之间的运算关系;
所述结果生成模块,包括:运算关系确定子模块和结果生成子模块;
其中,所述运算关系确定子模块,用于根据所述目标子查询条件之间的运算关系,确定查询到的数据间的运算关系;
所述结果生成子模块,用于根据查询到的数据和所确定的运算关系,生成数据查询结果。
9.根据权利要求6所述的装置,其特征在于,所述数据查询模块,具体用于:
根据预设表的数据索引,从所述预设表中获得满足所述子查询条件的数据。
10.根据权利要求6所述的装置,其特征在于,所述预设的查询条件优化规则包括:谓词下推、常量折叠、布尔函数简化中的一种或多种。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610264975.4A CN107315744A (zh) | 2016-04-26 | 2016-04-26 | 一种数据查询方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610264975.4A CN107315744A (zh) | 2016-04-26 | 2016-04-26 | 一种数据查询方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107315744A true CN107315744A (zh) | 2017-11-03 |
Family
ID=60184431
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610264975.4A Pending CN107315744A (zh) | 2016-04-26 | 2016-04-26 | 一种数据查询方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107315744A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108874907A (zh) * | 2018-05-25 | 2018-11-23 | 北京明略软件系统有限公司 | 一种数据查询方法和装置、计算机可读存储介质 |
CN110502339A (zh) * | 2019-07-23 | 2019-11-26 | 苏宁云计算有限公司 | 数据服务资源分配方法、装置、系统和存储介质 |
CN110909014A (zh) * | 2018-09-14 | 2020-03-24 | 阿里巴巴集团控股有限公司 | 优化建议生成及数据库查询方法、装置、设备及存储介质 |
CN111159228A (zh) * | 2019-12-26 | 2020-05-15 | 北京神州绿盟信息安全科技股份有限公司 | 一种数据查询方法和装置 |
CN113010539A (zh) * | 2019-12-20 | 2021-06-22 | 北京奇艺世纪科技有限公司 | 一种数据处理方法及装置 |
CN113268502A (zh) * | 2020-12-23 | 2021-08-17 | 上海右云信息技术有限公司 | 一种用于提供信息的方法与设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101681377A (zh) * | 2007-05-23 | 2010-03-24 | 微软公司 | 用于搜索的用户定义的相关性排序 |
CN103425672A (zh) * | 2012-05-17 | 2013-12-04 | 阿里巴巴集团控股有限公司 | 一种数据库索引的建立方法及装置 |
CN104123374A (zh) * | 2014-07-28 | 2014-10-29 | 北京京东尚科信息技术有限公司 | 分布式数据库中聚合查询的方法及装置 |
CN104408134A (zh) * | 2013-11-28 | 2015-03-11 | 中国科学院计算技术研究所 | 一种sql到云环境的映射方法及系统 |
-
2016
- 2016-04-26 CN CN201610264975.4A patent/CN107315744A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101681377A (zh) * | 2007-05-23 | 2010-03-24 | 微软公司 | 用于搜索的用户定义的相关性排序 |
CN103425672A (zh) * | 2012-05-17 | 2013-12-04 | 阿里巴巴集团控股有限公司 | 一种数据库索引的建立方法及装置 |
CN104408134A (zh) * | 2013-11-28 | 2015-03-11 | 中国科学院计算技术研究所 | 一种sql到云环境的映射方法及系统 |
CN104123374A (zh) * | 2014-07-28 | 2014-10-29 | 北京京东尚科信息技术有限公司 | 分布式数据库中聚合查询的方法及装置 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108874907A (zh) * | 2018-05-25 | 2018-11-23 | 北京明略软件系统有限公司 | 一种数据查询方法和装置、计算机可读存储介质 |
CN110909014A (zh) * | 2018-09-14 | 2020-03-24 | 阿里巴巴集团控股有限公司 | 优化建议生成及数据库查询方法、装置、设备及存储介质 |
CN110502339A (zh) * | 2019-07-23 | 2019-11-26 | 苏宁云计算有限公司 | 数据服务资源分配方法、装置、系统和存储介质 |
CN113010539A (zh) * | 2019-12-20 | 2021-06-22 | 北京奇艺世纪科技有限公司 | 一种数据处理方法及装置 |
CN111159228A (zh) * | 2019-12-26 | 2020-05-15 | 北京神州绿盟信息安全科技股份有限公司 | 一种数据查询方法和装置 |
CN113268502A (zh) * | 2020-12-23 | 2021-08-17 | 上海右云信息技术有限公司 | 一种用于提供信息的方法与设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107315744A (zh) | 一种数据查询方法及装置 | |
US7730079B2 (en) | Query comprehensions | |
US10860632B2 (en) | Information query method and device | |
CN103608812B (zh) | 业务智能系统的查询优化技术 | |
US6263328B1 (en) | Object oriented query model and process for complex heterogeneous database queries | |
CN104685497B (zh) | 通过过滤方法操作的聚合/分组的硬件实现 | |
CA2397405C (en) | Method for transforming sql queries | |
CN109684349A (zh) | 一种基于sql与图计算交互式分析的查询方法和系统 | |
WO2015010509A1 (zh) | 一种基于一维线性空间实现Trie树的词典检索方法 | |
JP2019040598A5 (zh) | ||
JP3235660B2 (ja) | 情報検索装置及びその方法ならびに情報検索プログラムを格納した記憶媒体 | |
CN103678513A (zh) | 一种交互式的检索式生成方法及系统 | |
CN110874366B (zh) | 数据处理、查询方法和装置 | |
CN108241709A (zh) | 一种数据集成方法、装置和系统 | |
CN102214216B (zh) | 一种层次关系数据上关键字检索结果的聚合摘要方法 | |
JP2985805B2 (ja) | 情報検索装置 | |
US20050171976A1 (en) | Diagrammatic method and system to build repository queries | |
Schubotz et al. | Querying Large Collections of Mathematical Publications: NTCIR10 Math Task. | |
Mitchell et al. | An architecture for query processing in persistent object stores | |
CN110162574B (zh) | 数据重分布方式的确定方法、装置、服务器及存储介质 | |
KR101218577B1 (ko) | 키워드 검색을 위한 sparql 질의 처리 수행 장치 및 방법 | |
CN107025255B (zh) | 用于确定对象序列中的对象的索引的系统和方法 | |
Sarathy et al. | Algebraic foundation and optimization for object based query languages | |
CN114730310A (zh) | 用于快速数据检索的通用数据索引 | |
Kalinsky et al. | Efficiently charting RDF |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20171103 |