CN115563148A - 数据库查询方法和装置 - Google Patents

数据库查询方法和装置 Download PDF

Info

Publication number
CN115563148A
CN115563148A CN202211289477.7A CN202211289477A CN115563148A CN 115563148 A CN115563148 A CN 115563148A CN 202211289477 A CN202211289477 A CN 202211289477A CN 115563148 A CN115563148 A CN 115563148A
Authority
CN
China
Prior art keywords
query
database query
database
query statement
statement
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
Application number
CN202211289477.7A
Other languages
English (en)
Inventor
王国平
朱涛
赵占越
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Oceanbase Technology Co Ltd
Original Assignee
Beijing Oceanbase Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Oceanbase Technology Co Ltd filed Critical Beijing Oceanbase Technology Co Ltd
Priority to CN202211289477.7A priority Critical patent/CN115563148A/zh
Publication of CN115563148A publication Critical patent/CN115563148A/zh
Priority to PCT/CN2023/118705 priority patent/WO2024082881A2/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • G06F16/2445Data retrieval commands; View definitions

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Mathematical Physics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

提供一种数据库查询方法和装置。所述数据库查询方法包括:接收第一数据库查询语句,所述第一数据库查询语句包括第一查询分支和第二查询分支,所述第一查询分支和所述第二查询分支通过OR谓词连接;将所述第一数据库查询语句中的所述OR谓词展开,得到第二数据库查询语句,所述第二数据库查询语句包括第三数据库查询语句和第四数据库查询语句,所述第三数据库查询语句用于执行所述第一查询分支,所述第四数据库查询语句用于执行所述第二查询分支,且所述第三数据库查询语句和所述第四数据库查询语句基于UNION DISTINCT相连;根据所述第二数据库查询语句查询数据库中的数据。

Description

数据库查询方法和装置
技术领域
本公开涉及数据库领域,并且更为具体地,涉及一种数据库查询方法和装置。
背景技术
数据库查询语句可能包含OR谓词。为了提高数据库查询语句的执行性能,通常会对包含OR谓词的数据库查询语句进行查询改写,以将OR谓词展开。
相关技术基于Union All对OR谓词进行展开。但在特定场景下,基于Union All对OR谓词进行展开之后,数据库查询语句的执行性能仍然较差。
发明内容
本公开提供一种数据库查询方法和装置,以提升数据库查询语句的执行性能。
第一方面,提供一种数据库查询方法,包括:接收第一数据库查询语句,所述第一数据库查询语句包括第一查询分支和第二查询分支,所述第一查询分支和所述第二查询分支通过OR谓词连接;将所述第一数据库查询语句中的所述OR谓词展开,得到第二数据库查询语句,所述第二数据库查询语句包括第三数据库查询语句和第四数据库查询语句,所述第三数据库查询语句用于执行所述第一查询分支,所述第四数据库查询语句用于执行所述第二查询分支,且所述第三数据库查询语句和所述第四数据库查询语句基于UNIONDISTINCT相连;根据所述第二数据库查询语句查询数据库中的数据。
可选地,作为一种可能的实现方式,在所述将所述第一数据库查询语句中的所述OR谓词展开之前,所述方法还包括:检查所述第一数据库查询语句中的查询分支是否能够输出唯一列集合;所述将所述第一数据库查询语句中的所述OR谓词展开,包括:如果所述第一数据库查询语句中的查询分支均能够输出唯一列集合,则将所述第一数据库查询语句中的所述OR谓词展开。
可选地,作为一种可能的实现方式,在所述将所述第一数据库查询语句中的所述OR谓词展开之前,所述方法还包括:对所述第一数据库查询语句中的查询分支进行SPJ分离。
可选地,作为一种可能的实现方式,所述第一查询分支和/或所述第二查询分支中的谓词为子查询谓词。
可选地,作为一种可能的实现方式,所述数据库查询语句为SQL语句。
第二方面,提供一种数据库查询装置,包括:接收模块,用于接收第一数据库查询语句,所述第一数据库查询语句包括第一查询分支和第二查询分支,所述第一查询分支和所述第二查询分支通过OR谓词连接;展开模块,用于将所述第一数据库查询语句中的所述OR谓词展开,得到第二数据库查询语句,所述第二数据库查询语句包括第三数据库查询语句和第四数据库查询语句,所述第三数据库查询语句用于执行所述第一查询分支,所述第四数据库查询语句用于执行所述第二查询分支,且所述第三数据库查询语句和所述第四数据库查询语句基于UNION DISTINCT相连;查询模块,用于根据所述第二数据库查询语句查询数据库中的数据。
可选地,作为一种可能的实现方式,所述装置还包括:检查模块,用于在所述将所述第一数据库查询语句中的所述OR谓词展开之前,检查所述第一数据库查询语句中的查询分支是否能够输出唯一列集合;所述展开模块用于:如果所述第一数据库查询语句中的查询分支均能够输出唯一列集合,则将所述第一数据库查询语句中的所述OR谓词展开。
可选地,作为一种可能的实现方式,所述装置还包括:分离模块,用于在所述将所述第一数据库查询语句中的所述OR谓词展开之前,对所述第一数据库查询语句中的查询分支进行SPJ分离。
可选地,作为一种可能的实现方式,所述第一查询分支和/或所述第二查询分支中的谓词为子查询谓词。
可选地,作为一种可能的实现方式,所述数据库查询语句为SQL语句。
第三方面,提供一种数据库查询装置,包括:存储器,用于存储指令;处理器,用于执行所述存储器中存储的指令,以执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法。
第四方面,提供一种计算机可读存储介质,其上存储有用于执行第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
第五方面,提供一种计算机程序产品,包括用于执行第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
相关技术在基于Union All对OR谓词展开时,需要使用LLNVL谓词进行去重操作(即去除OR谓词的多个查询分支的查询结果中的重复数据)。如果OR谓词连接的查询分支包含复杂谓词(子查询谓词),则会导致LLNVL谓词包含子查询(即LLNVL谓词的参数为子查询)。由于LLNVL谓词无法进行子查询提升(子查询执行效率很低,通常希望将子查询与外层查询转换成两个数据库表的连接操作,从而避免执行子查询,这种转换即为子查询提升,但并非所有的谓词均可以进行子查询提升,LLNVL谓词就无法进行子查询提升),因此会降低数据库查询语句在OR谓词展开之后的执行效率。本公开实施例基于UNION DISTINCT实现OR谓词展开,由于UNION DISTINCT本身具有去重功能,因此无需引入LLNVL谓词,也就规避了上述问题。换句话说,即使OR谓词连接的查询分支包含复杂谓词(子查询谓词),本公开实施例仍然能够很好地提升数据库查询语句的执行效率。
附图说明
为了更清楚地说明本公开实施例或背景技术中的技术方案,下面将对本公开实施例或背景技术中所需要使用的附图进行说明。
图1是本公开一个实施例提供的数据库查询方法的结构示意图。
图2是本公开另一实施例提供的数据库查询方法的结构示意图。
图3是本公开一个实施例提供的数据库查询装置的结构示意图。
图4是本公开另一实施例提供的数据库查询装置的结构示意图。
具体实施方式
下面结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅是本公开一部分实施例,而不是全部实施例。
随着技术的发展,数据库系统(如OceanBase数据库)的应用越来越广泛。不同类型的数据库系统具有各自支持的数据库查询语句,使得数据库系统的用户可以方便地对该数据库系统进行访问(如对数据库系统中的数据进行查询、增、删等操作)。这里提到的数据库查询语言例如可以是结构化查询语言(structured query language,SQL)。
数据库查询语句的表达式不同,则数据库查询语句的执行性能可能不同。因此,为了提升数据库查询语句的执行性能,数据库系统可以对接收到的数据库查询语句进行查询改写(数据库查询语句的查询改写通常是一种等价性改写,即该查询改写并不会改变数据库查询语句的查询结果)。
OR谓词展开是一种常见的查询改写方式。以数据库查询语句为SELECT语句为例,OR谓词展开指的是将一个具有OR谓词的SELECT语句拆分成多个SELECT语句。该多个SELECT语句中的每个SELECT语句可用于执行OR谓词的一个查询分支。OR谓词展开通过拆分OR谓词到每个SELECT语句,使得被拆分后的SELECT语句可能可以触发更多的优化空间(即被拆分后的SELECT语句可能以执行性能更优的执行算法被执行),从而达到提升数据库语句的查询性能的目的。
作为一个示例,首先为数据库系统创建两张表:
create table t1(c1 int primary key,c2 int,c3 int,c4 int);
create table t2(c1 int primary key,c2 int,c3 int,c4 int).
然后,接收原始数据库查询语句Q1:
select*from t1,t2 where t1.c2=t2.c2 or t1.c3=t2.c3.
在数据库查询语句Q1中,“t1.c2=t2.c2”和“t1.c3=t2.c3”分别为两个条件,该两个条件采用OR谓词连接。针对基于OR谓词的连接操作,如果不对数据库查询语句Q1进行查询改写,则只能使用嵌套循环连接(NESTED LOOP JOIN)算法来执行该数据库语句Q1。
嵌套循环连接是一种通用、但效率很低的连接算法。具体而言,嵌套循环连接由两个FOR循环构成,并因此而得名。假设要连接的两个表为T1和T2,连接条件为P,则嵌套循环连接就选择其中一个作为外层循环,另一个作为内层循环,逐一比较表T1和表T2中的每个元组,从而找出所有匹配的元组。嵌套循环连接比较通用。嵌套循环连接与线性扫描一样,不需要索引,且不管是什么样的连接条件,该算法都适用。也就是说,对于任何类型的连接操作,该算法都只需要做稍微的调整就能进行运算。但是,嵌套循环连接的执行性能比较差。因为该算法过程中需要逐一比较表T1和表T2中的每一个元组,当数据规模较大而不能完全放入内存中时其引起的磁盘与内存交换比较频繁,即使数据能够完全放入内存,则嵌套循环连接执行过程中也会引起CPU的CACHE命中率低下,从而严重影响系统效率。
为了能够避免使用嵌套循环连接,可以对数据库查询语句Q1进行查询改写,即对数据库查询语句Q1中的OR谓词进行展开。例如,可以将数据库查询语句Q1改写成如下所示的数据库查询语句Q2:
select*from t1,t2 where t1.c2=t2.c2;
union all
select*from t1,t2 where t1.c3=t2.c3 and llnvl(t1.c2=t2.c2).
对于数据库查询语句Q2,OR谓词被拆分成了多个简单的SELECT语句,而每个SELECT语句除了可以使用嵌套循环连接的方式来执行,也可以选择更加高效的合并连接(MERGE JOIN,合并连接算法又称排序合并连接,可以用于计算自然连接和等值连接。假设要连接的两个表为T1和T2,则在进行连接之前先让表T1和表T2是有序的。然后分别对两个表进行扫描一遍即可完成。合并连接执行起来非常高效,其时间复杂度是线性的O(n),其中n为表T1和表T2中元组数最多的表的元组个数)和哈希连接(HASH JOIN,哈希连接类似合并连接。在哈希连接算法中,哈希函数用于对两个表进行划分。此算法的基本思想是把两个表按连接属性划分成具有相同哈希值的元组集合。哈希连接不需要索引,并且与嵌套循环连接相比,哈希连接更容易处理大结果集)来执行,从而提升数据库语句的执行性能。
目前,在支持OR谓词展开的数据库系统中,均采用基于“Union All”的形式执行OR谓词展开。这种OR谓词展开形式对于一些包含复杂谓词(比如子查询谓词)的OR谓词是非常低效的,从而可能导致OR谓词展开带来的效率方面的优势丧失。下面对这一问题产生的原因进行分析。
基于“Union All”的OR谓词展开方式是利用“Union All”操作符将多个数据库查询语句(每个据库查询语句用于执行OR谓词的一个查询分支)组织起来,以计算该多个数据库查询语句的查询结构的并集。如果该多个数据库查询语句的查询结果包含多个重复的数据,“Union All”操作符会返回该多个重复的数据。
为了避免多个数据库查询语句产生重复数据,基于“Union All”的OR谓词展开方式会引入LLNVL谓词(如上文提及的数据库查询语句Q2中的“llnvl(t1.c2=t2.c2)”),以去除重复数据。LLNVL谓词的引入在某些特定的场景下会导致数据库查询语句的性能次优。这里提到的特定场景,例如可以是OR谓词的查询分支包含复杂谓词,如子查询谓词的场景(即谓词的参数包含子查询)。
作为示例,下文中的数据库查询语句Q3包含OR谓词,该OR谓词包含两个查询分支,且每个查询分支包含复杂谓词(即下文中的以select子查询为参数的EXISTS谓词):
create table t1(c1 int primary key,c2 int,c3 int,c4 int);
create table t2(c1 int primary key,c2 int,c3 int,c4 int);
create table t3(c1 int primary key,c2 int,c3 int)
Q3:
select c2 from t1 where exists(select 1from t2 where t2.c2=t1.c2)or
exsits(select 1from t3 where t3.c3=t1.c3);
对数据库查询语句Q3进行OR谓词展开之后,得到如下数据库查询语句Q4:
select c2 from t1 where exists(select 1from t2 where t2.c2=t1.c2)
union all
select c2 from t1 where exsits(select 1from t3 where t3.c3=t1.c3)and
llnvl(exists(select 1from t2 where t2.c2=t1.c2)).
数据库查询语句Q4中的第一个SELECT语句的谓词EXISTS虽然包含子查询,但可以通过子查询提升(子查询提升也是一种查询改写方式,旨在将一个子查询表示成多表连接的形式,从而合并到主查询中,从而提升查询性能)转化成连接(JOIN),从而可以使用更多的高效连接算法对查询性能进行优化。同理,数据库查询语句Q4中的第二个SELECT语句的EXISTS也可以通过子查询提升的方式转化成连接(JOIN),从而可以使用更多的高效连接算法对查询性能进行优化。但是,目前数据库系统均不支持LLNVL中的子查询的提升操作,因此,针对谓词LLNVL,只能使用类似Nested Loop Join的方式来执行,执行性能较低。由此可见,当OR谓词的查询分支包含复杂谓词(如子查询谓词)的情况下,即使进行了OR谓词展开,数据库查询语句的查询性能也无法得到较大的提升。
针对上述问题,本公开实施例提出一种基于“UNION DISTINCT”的OR谓词展开方式。由于“UNION DISTINCT”自身具有数据去重功能,因此无需使用LLNVL谓词,也就避免了此类复杂谓词的计算,从而可以提升数据库查询语句的执行性能。
仍以上文提到的数据库查询语句Q3为例,可以基于“UNION DISTINCT”对Q3中的OR谓词展开,从而将该数据库查询语句Q3转换成如下数据库查询语句Q5:
select c2
from(select c1,c2 from t1 where exists(select 1from t2 where t2.c2=t1.c2)
union distinct
select c1,c2 from t1 where exsits(select 1from t3 where t3.c3=t1.c3)).
对比数据库查询语句Q4和数据库查询语句Q5可以看出,数据库查询语句Q5仅包含可以进行子查询提升的EXISTS谓词,并不包含无法进行子查询提升的LLNVL谓词,因此数据库查询语句Q5无需执行Nested Loop Join,从而具有更高的执行性能。
下面结合图1,对本公开实施例提供的数据库查询方法进行更为详细地举例说明。图1的方法100可以由数据库系统执行,具体可以由数据库系统中的优化器执行。本公开实施例对该数据库系统的类型不作具体限定,例如可以是分布式的数据库。
参见图1,在步骤S110,接收第一数据库查询语句。该第一数据库查询语句也可以是原始数据库查询语句,如数据库系统的用户输入的数据库查询语句,也可以是对原始数据库查询语句进行改写之后的数据库查询语句。该第一数据库查询语句例如可以是SQL语句。
该第一数据库查询语句可以包括第一查询分支和第二查询分支,且第一查询分支和第二查询分支通过OR谓词连接。因此,为了提升第一数据库查询语句的执行性能,可以考虑对第一数据库查询语句进行OR谓词展开。
该第一查询分支中的谓词可以为复杂谓词。例如,该第一查询分支中的谓词可以为子查询谓词,即谓词的参数包含子查询。以第一数据库查询语句为前文提到的Q3为例,该第一数据库查询语句的第一查询分支包含子查询谓词,即exists(select 1from t2 wheret2.c2=t1.c2)。
该第二查询分支中的谓词可以为复杂谓词。例如,该第二查询分支中的谓词可以为子查询谓词,即谓词的参数包含子查询。以第一数据库查询语句为前文提到的Q3为例,该第一数据库查询语句的第二查询分支包含子查询谓词,即exsits(select 1from t3 wheret3.c3=t1.c3)。
在步骤S120,将第一数据库查询语句中的OR谓词展开,得到第二数据库查询语句。第二数据库查询语句与第一数据库查询语句可以是等价的,即第一数据库语句与第二数据库语句可以对应相同的查询结果。
第二数据库查询语句可以包括第三数据库查询语句和第四数据库查询语句。第三数据库查询语句可用于执行OR谓词的第一查询分支。第四数据库查询语句可用于执行OR谓词的第二查询分支。第三数据库查询语句和第四数据库查询语句基于UNION DISTINCT相连。也就是说,可以利用UNION DISTINCT操作符计算第三数据库查询语句和第四数据库查询语句的查询结果的并集。由于UNION DISTINCT操作符本身具有去重功能,因此,无需添加专门用于去重的谓词,如前文提到的LLNVL谓词。
第三数据库查询语句和第四数据库语句的查询结果可以包含唯一列集合(或者说,第三数据库查询语句和第四数据库语句均投影出唯一列集合)。所谓唯一列集合,指的是能够唯一标识第三数据库查询语句和第四数据库查询语句查询出的行的列集合。以第三数据库查询语句和第四数据库查询语句均查询数据库表为例,该唯一列集合可以是该数据库表的主键。UNION DISTINCT基于第三数据库查询语句和第四数据库查询语句各自投影出的唯一列集合,可以执行去重操作。以主键作为唯一列集合为例,如果第三数据库查询语句和第四数据库查询语句的查询结果包括相同主键对应的数据,则仅保留一份数据即可。待去重结束之后,可以将唯一列集合从查询结果中删除即可。
在步骤S130,根据第二数据库查询语句查询数据库中的数据。例如,可以生成第二数据库查询语句对应的执行计划,然后基于该执行计划执行数据库查询任务,并返回第二数据库查询语句对应的查询结果。
图1对应的实施例基于UNION DISTINCT执行OR谓词展开,由于UNION DISTINCT自身具有数据去重功能,因此无需使用谓词LLNVL,也就避免了此类复杂谓词的计算,从而可以提升OR谓词展开之后的数据库查询语句的执行性能。
在一些实施例中,在执行步骤S120之前,图1的方法还可以包括:对第一数据库查询语句进行检查,以确定第一数据库查询语句是否满足展开条件。例如,可以检查第一数据库查询语句中的查询分支是否能够输出唯一列集合。如果第一数据库查询语句中的查询分支无法输出唯一列集合,则无法基于UNION DISTINCT进行去重操作(因为UNION DISTINCT需要基于唯一列集合实现去重功能,这点是UNION DISTINCT与UNION ALL的主要不同)。在这种情况下,可以不进行OR谓词展开,或者,也可以采用传统的基于UNION ALL的方式进行OR谓词展开。
作为一个示例,假设第一数据库查询语句查询的对象并非真实的数据库表,而是一视图(view),且该视图里面包含了层次查询,那么该视图是没办法输出唯一列集合的。因此,在这种情况下,可以不进行OR谓词展开,或者,也可以采用传统的基于UNION ALL的方式进行OR谓词展开。
相应地,如果第一数据库查询语句中的查询分支均能够输出唯一列集合,则可以基于UNION DISTINCT将第一数据库查询语句中的OR谓词展开。
在一些实施例中,在执行步骤S120之前,图1的方法还可以包括:对所述第一数据库查询语句中的查询分支进行SPJ(Selection-Projection-Join)分离。SPJ查询是指只包括Selection,Projection和Join的查询。SPJ分离指的是将查询分支转换成只包括Selection,Projection和Join的查询。
作为一种可能的实现方式,可以先确定第一数据库查询语句中的每个查询分支是否为SPJ查询。如果某个查询分支本身已经是SPJ查询,那么不需要对该查询分支进行SPJ分离;如果某个查询分支并非SPJ查询(例如,如果某个查询分支包含Group-by子句,则该查询分支不是SPJ查询),则需要对该查询分支进行SPJ分离。
下面结合图2,更加详细地描述本公开实施例。应注意,图2所示的方法200仅仅是为了帮助本领域技术人员理解本公开实施例,而非要将本公开实施例限于所例示的具体数值或具体场景。本领域技术人员根据所给出的例子,显然可以进行各种等价的修改或变化,这样的修改或变化也落入本公开实施例的范围内。
参见图2,在步骤S210,检查数据库查询语句是否能够进行OR谓词展开。例如,可以检查OR谓词是否满足展开条件、检查查询分支是否能够输出唯一列集合等。
例如,数据库查询语句为下文所示的Q6:
create table t1(c1 int primary key,c2 int,c3 int,c4 int);
create table t2(c1 int primary key,c2 int,c3 int,c4 int);
create table t3(c1 int primary key,c2 int,c3 int);
create table t4(c1 int primary key,c2 int);
Q6:
select t1.c4,sum(t4.c1)
from t1,t4
where t1.c2=t4.c2 and
exists(select 1from t2 where t2.c2=t1.c2)or
exsits(select 1from t3 where t3.c3=t1.c3);
Group by t1.c4
数据库查询语句Q6中的OR谓词所在的查询分支存在两个表:t1和t4。从t1和t4的创建过程可以看出,t1和t4都具有主键,所以(t1.c1,t4.c1)可以作为输出唯一列集合,这个集合的值可以用来标识表中的唯一的一行。
在步骤S220,对数据库查询语句中的查询分支进行SPJ分离。如果查询分支本身就是SPJ查询,那么不需要进行分离,否则就需要SPJ分离。
继续以数据库查询为上文提到的Q6为例,Q6包括了Group-by子句,该子句并不是SPJ查询。因此,可以对该查询分支进行SPJ分离,从而将Q6转换为下文所示的Q7,其中temp为分离之后的SPJ查询分支。
Q7:
select temp.c4,sum(c1)
from(select t1.c4 as c4,t4.c1 as c1
from t1,t4
where t1.c2=t4.c2 and
exists(select 1from t2 where t2.c2=t1.c2)or
exsits(select 1from t3 where t3.c3=t1.c3))temp
Group by temp.c4
在步骤S230,对分离后的SPJ分支进行OR谓词展开。将OR条件拆分为多个简单条件,并且创建相对应的SELECT语句,同时为每个SELECT语句添加相对应的输出唯一列集合,最终把这些查询以UNION DISTINCT形式组合起来。下文中的Q8即为对Q7中temp表进行OR谓词展开之后的结果,其中t1.c1和t4.c1为在查询分支中添加的唯一列集合。
Q8:
select t1.c1,t1.c4,t4.c1
from t1,t4
where t1.c2=t4.c2 and exists(select 1from t2 where t2.c2=t1.c2)
union distinct
select t1.c1,t1.c4,t4.c1
from t1,t4
where t1.c2=t4.c2 and exsits(select 1from t3 where t3.c3=t1.c3)
在步骤S240,对展开后的UNION DISTINCT查询进行查询封装,并对最终需要投影出来的列进行投影。下文中的Q9展示了对Q8的一次查询封装。
Q9:
select t1.c1,t4.c1
from(select t1.c1,t1.c4,t4.c1
from t1,t4
where t1.c2=t4.c2 and exists(select 1from t2 where t2.c2=t1.c2)
union distinct
select t1.c1,t1.c4,t4.c1
from t1,t4
where t1.c2=t4.c2 and exsits(select 1from t3 where t3.c3=t1.c3))temp
本示例提出了一种基于Union Distinc的OR谓词展开方法,不同于基于Union All的OR谓词展开方法,基于Union Distinc的OR谓词展开方式无需添加LLNVL谓词来避免产生重复数据。对于包括复杂谓词(比如子查询谓词)的OR谓词,由于本示例提供的方法可以避免添加LLNVL谓词,因此可以减少复杂谓词的计算,提升OR谓词展开的优化空间,进而达到提升数据库查询语句的执行性能的目的。
需要说明的是,本公开的说明书和权利要求书中的术语“第一”、“第二”、“第三”和“第四”等是用于区别不同的对象,而不是用于描述特定顺序。
上文结合图1和图2,详细描述了本公开的方法实施例,下面结合图3和图4,详细描述本公开的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。
图3是本公开实施例提供的一种数据库查询装置的结构示意图。图3所示的数据库查询装置300包括接收模块310,展开模块320以及查询模块330。
接收模块310可用于接收第一数据库查询语句。所述第一数据库查询语句包括第一查询分支和第二查询分支,所述第一查询分支和所述第二查询分支通过OR谓词连接。
展开模块320可用于将所述第一数据库查询语句中的所述OR谓词展开,得到第二数据库查询语句,所述第二数据库查询语句包括第三数据库查询语句和第四数据库查询语句,所述第三数据库查询语句用于执行所述第一查询分支,所述第四数据库查询语句用于执行所述第二查询分支,且所述第三数据库查询语句和所述第四数据库查询语句基于UNION DISTINCT相连。
查询模块330可用于根据所述第二数据库查询语句查询数据库中的数据。
可选地,在一些实施例中,所述装置300还可包括:检查模块,用于在所述将所述第一数据库查询语句中的所述OR谓词展开之前,检查所述第一数据库查询语句中的查询分支是否能够输出唯一列集合;所述展开模块320可用于如果所述第一数据库查询语句中的查询分支均能够输出唯一列集合,则将所述第一数据库查询语句中的所述OR谓词展开。
可选地,在一些实施例中,所述装置300还可包括:分离模块,用于在所述将所述第一数据库查询语句中的所述OR谓词展开之前,对所述第一数据库查询语句中的查询分支进行SPJ分离。
可选地,在一些实施例中,所述第一查询分支和/或所述第二查询分支中的谓词为子查询谓词。
可选地,在一些实施例中,所述数据库查询语句为SQL语句。
图4是本公开另一实施例提供的数据库查询装置的结构示意图。图4所述的数据库查询装置400可以包括存储器410和处理器420,存储器410可以用于存储指令。处理器420可以用于执行存储器410中存储的指令,以实现前文描述的各个方法中的步骤。在一些实施例中,该装置400还可以包括网络接口430,处理器320与外部设备的数据交换可以通过该网络接口430实现。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(digital video disc,DVD))、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。
本领域普通技术人员可以意识到,结合本公开实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。

Claims (11)

1.一种数据库查询方法,包括:
接收第一数据库查询语句,所述第一数据库查询语句包括第一查询分支和第二查询分支,所述第一查询分支和所述第二查询分支通过OR谓词连接;
将所述第一数据库查询语句中的所述OR谓词展开,得到第二数据库查询语句,所述第二数据库查询语句包括第三数据库查询语句和第四数据库查询语句,所述第三数据库查询语句用于执行所述第一查询分支,所述第四数据库查询语句用于执行所述第二查询分支,且所述第三数据库查询语句和所述第四数据库查询语句基于UNION DISTINCT相连;
根据所述第二数据库查询语句查询数据库中的数据。
2.根据权利要求1所述的方法,在所述将所述第一数据库查询语句中的所述OR谓词展开之前,所述方法还包括:
检查所述第一数据库查询语句中的查询分支是否能够输出唯一列集合;
所述将所述第一数据库查询语句中的所述OR谓词展开,包括:
如果所述第一数据库查询语句中的查询分支均能够输出唯一列集合,则将所述第一数据库查询语句中的所述OR谓词展开。
3.根据权利要求1所述的方法,在所述将所述第一数据库查询语句中的所述OR谓词展开之前,所述方法还包括:
对所述第一数据库查询语句中的查询分支进行SPJ分离。
4.根据权利要求1所述的方法,所述第一查询分支和/或所述第二查询分支中的谓词为子查询谓词。
5.根据权利要求1所述的方法,所述数据库查询语句为SQL语句。
6.一种数据库查询装置,包括:
接收模块,用于接收第一数据库查询语句,所述第一数据库查询语句包括第一查询分支和第二查询分支,所述第一查询分支和所述第二查询分支通过OR谓词连接;
展开模块,用于将所述第一数据库查询语句中的所述OR谓词展开,得到第二数据库查询语句,所述第二数据库查询语句包括第三数据库查询语句和第四数据库查询语句,所述第三数据库查询语句用于执行所述第一查询分支,所述第四数据库查询语句用于执行所述第二查询分支,且所述第三数据库查询语句和所述第四数据库查询语句基于UNIONDISTINCT相连;
查询模块,用于根据所述第二数据库查询语句查询数据库中的数据。
7.根据权利要求6所述的装置,所述装置还包括:
检查模块,用于在所述将所述第一数据库查询语句中的所述OR谓词展开之前,检查所述第一数据库查询语句中的查询分支是否能够输出唯一列集合;
所述展开模块用于:
如果所述第一数据库查询语句中的查询分支均能够输出唯一列集合,则将所述第一数据库查询语句中的所述OR谓词展开。
8.根据权利要求6所述的装置,所述装置还包括:
分离模块,用于在所述将所述第一数据库查询语句中的所述OR谓词展开之前,对所述第一数据库查询语句中的查询分支进行SPJ分离。
9.根据权利要求6所述的装置,所述第一查询分支和/或所述第二查询分支中的谓词为子查询谓词。
10.根据权利要求6所述的装置,所述数据库查询语句为SQL语句。
11.一种数据库查询装置,包括:
存储器,用于存储指令;
处理器,用于执行所述存储器中存储的指令,以执行如权利要求1-5中任一项所述的方法。
CN202211289477.7A 2022-10-20 2022-10-20 数据库查询方法和装置 Pending CN115563148A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202211289477.7A CN115563148A (zh) 2022-10-20 2022-10-20 数据库查询方法和装置
PCT/CN2023/118705 WO2024082881A2 (zh) 2022-10-20 2023-09-14 数据库查询方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211289477.7A CN115563148A (zh) 2022-10-20 2022-10-20 数据库查询方法和装置

Publications (1)

Publication Number Publication Date
CN115563148A true CN115563148A (zh) 2023-01-03

Family

ID=84746151

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211289477.7A Pending CN115563148A (zh) 2022-10-20 2022-10-20 数据库查询方法和装置

Country Status (2)

Country Link
CN (1) CN115563148A (zh)
WO (1) WO2024082881A2 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024082881A3 (zh) * 2022-10-20 2024-08-02 北京奥星贝斯科技有限公司 数据库查询方法和装置

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6996557B1 (en) * 2000-02-15 2006-02-07 International Business Machines Corporation Method of optimizing SQL queries where a predicate matches nullable operands
CN105975617A (zh) * 2016-05-20 2016-09-28 北京京东尚科信息技术有限公司 一种多分区表查询处理的方法和装置
CN112199390B (zh) * 2020-09-30 2023-05-30 上海达梦数据库有限公司 一种数据库中数据查询方法、装置、设备及存储介质
CN114297233A (zh) * 2021-12-31 2022-04-08 北京人大金仓信息技术股份有限公司 数据库查询方法、装置、电子设备、介质和程序产品
CN114265874B (zh) * 2022-03-02 2022-05-03 北京奥星贝斯科技有限公司 查询数据的方法和装置
CN114416784B (zh) * 2022-03-28 2022-07-08 北京奥星贝斯科技有限公司 处理数据库查询语句的方法、装置及原生分布式数据库
CN115563148A (zh) * 2022-10-20 2023-01-03 北京奥星贝斯科技有限公司 数据库查询方法和装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024082881A3 (zh) * 2022-10-20 2024-08-02 北京奥星贝斯科技有限公司 数据库查询方法和装置

Also Published As

Publication number Publication date
WO2024082881A3 (zh) 2024-08-02
WO2024082881A2 (zh) 2024-04-25

Similar Documents

Publication Publication Date Title
US8332389B2 (en) Join order for a database query
US10572484B2 (en) Duplicate reduction or elimination with hash join operations
US10133778B2 (en) Query optimization using join cardinality
US9390115B2 (en) Tables with unlimited number of sparse columns and techniques for an efficient implementation
Simitsis et al. State-space optimization of ETL workflows
US7730055B2 (en) Efficient hash based full-outer join
US9870401B2 (en) Database system with highly denormalized database structure
US11436225B2 (en) Database hierarchy-independent data drilling
US8612421B2 (en) Efficient processing of relational joins of multidimensional data
US10146837B1 (en) RLE-aware optimization of SQL queries
JP4747094B2 (ja) リレーショナルデータベースシステムでデータを緻密化するためのdmlステートメント
US8965918B2 (en) Decomposed query conditions
JP2005521954A (ja) リレーショナルデータベースをクエリーする方法および装置
CN108959538B (zh) 全文检索系统及方法
CN112395303A (zh) 查询的执行方法、装置、电子设备及计算机可读介质
CN112231321B (zh) 一种Oracle二级索引及索引实时同步方法
CN114265874B (zh) 查询数据的方法和装置
WO2024082881A2 (zh) 数据库查询方法和装置
JP2005521953A (ja) リレーショナルデータベースをクエリーする方法および装置
US6745173B1 (en) Generating in and exists queries using tensor representations
CN102214216A (zh) 一种层次关系数据上关键字检索结果的聚合摘要方法
CN114416784B (zh) 处理数据库查询语句的方法、装置及原生分布式数据库
Hasan et al. Data transformation from sql to nosql mongodb based on r programming language
CN114490724B (zh) 处理数据库查询语句的方法和装置
KR100984976B1 (ko) 이질적인 2차원 테이블의 데이터를 통합하여 검색하는 방법

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