分布式数据库的逻辑子计划执行方法、装置及系统转让专利

申请号 : CN202210914893.5

文献号 : CN114969111B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 唐铭豆潘毅余璜王国平

申请人 : 北京奥星贝斯科技有限公司

摘要 :

本说明书的实施例提供了一种分布式数据库的逻辑子计划执行方法、装置及系统。在该方法中,按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子:响应于当前执行算子属于涉及非相关子查询的执行算子,利用预选的第一执行线程执行当前执行算子,至少一个用于与第一执行线程共同执行逻辑子计划的第二执行线程等待当前执行算子的算子执行结果;响应于逻辑子计划中存在未被执行的执行算子,更新当前执行算子以及继续执行上述执行步骤;以及响应于逻辑子计划中不存在未被执行的执行算子,将当前执行算子的算子执行结果作为逻辑子计划的执行结果。

权利要求 :

1.一种用于执行分布式数据库的逻辑子计划的方法,所述方法包括:按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子:响应于所述当前执行算子属于涉及非相关子查询的执行算子,

利用预选的第一执行线程执行所述当前执行算子,其中,所述第一执行线程包括分布式存储节点所启用的、用于执行当前逻辑子计划的执行线程,至少一个用于与所述第一执行线程共同执行所述逻辑子计划的第二执行线程等待所述当前执行算子的算子执行结果;

响应于所述逻辑子计划中存在未被执行的执行算子,更新当前执行算子以及继续执行所述执行步骤;以及响应于所述逻辑子计划中不存在未被执行的执行算子,将所述当前执行算子的算子执行结果作为所述逻辑子计划的执行结果。

2.如权利要求1所述的方法,其中,所述预选的第一执行线程包括从用于执行所述逻辑子计划的至少两个执行线程中随机选取的执行线程。

3.如权利要求2所述的方法,其中,所述利用预选的第一执行线程执行所述当前执行算子包括:利用所述第一执行线程接收第一子查询结果,其中,所述第一子查询结果包括所述当前执行算子所涉及的非相关子查询所依赖的子查询的查询结果;以及利用所述第一执行线程根据所述第一子查询结果执行所述当前执行算子。

4.如权利要求1所述的方法,其中,所述当前执行算子包括目标执行算子,所述目标执行算子与所述当前执行算子的前一个执行算子涉及同一非相关子查询,所述预选的第一执行线程包括执行所述前一个执行算子的执行线程。

5.如权利要求4所述的方法,其中,所述至少一个用于与所述第一执行线程共同执行所述逻辑子计划的第二执行线程等待所述当前执行算子的执行结果包括:阻塞至少一个所述第二执行线程,以等待所涉及的非相关子查询的第二子查询结果。

6.如权利要求1所述的方法,其中,在所述响应于所述逻辑子计划中存在未被执行的执行算子,更新当前执行算子以及继续执行所述执行步骤之前,所述执行步骤还包括:响应于所述当前执行算子不属于涉及非相关子查询的执行算子,利用所述第一执行线程和至少一个所述第二执行线程并行执行所述当前执行算子。

7.如权利要求1到6中任一所述的方法,所述分布式数据库包括多个分布式数据存储节点,所述第二执行线程包括与所述第一执行线程位于同一分布式数据存储节点的执行线程和/或与所述第一执行线程位于不同分布式数据存储节点的执行线程。

8.如权利要求7所述的方法,其中,所述逻辑子计划通过以数据重分布点为边界对分布式执行计划进行逻辑转换得到,所述执行算子包括数据处理算子和/或数据交换算子,并且所述数据处理算子和/或数据交换算子之间形成树状结构以所述逻辑子计划为单位被调度到所述分布式数据库中的多个分布式数据存储节点并行处理。

9.一种用于在分布式数据库进行数据查询的方法,所述分布式数据库包括多个分布式数据存储节点,包括:接收用户提供的数据查询语句;

根据所接收的数据查询语句生成分布式执行计划;

对所述分布式执行计划进行逻辑转换得到多个逻辑子计划;

按照调度顺序将所述多个逻辑子计划依次调度到对应的分布式数据存储节点来按照如权利要求1到8中任一所述的方法执行;以及根据最顶层逻辑子计划的执行结果生成数据查询结果提供给用户。

10.如权利要求9所述的方法,其中,所述多个逻辑子计划被形成为树状结构,所述逻辑子计划的调度顺序根据所述逻辑子计划的树状结构确定。

11.一种用于执行分布式数据库的逻辑子计划的计划执行装置,包括:第一执行单元,被配置为按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子:响应于所述当前执行算子属于涉及非相关子查询的执行算子,利用预选的第一执行线程执行所述当前执行算子,其中,所述第一执行线程包括分布式存储节点所启用的、用于执行当前逻辑子计划的执行线程,至少一个用于与所述第一执行线程共同执行所述逻辑子计划的第二执行线程等待所述当前执行算子的算子执行结果;

当前算子更新单元,被配置为响应于所述逻辑子计划中存在未被执行的执行算子,更新当前执行算子;

结果生成单元,被配置为响应于所述逻辑子计划中不存在未被执行的执行算子,将所述当前执行算子的算子执行结果作为所述逻辑子计划的执行结果。

12.如权利要求11所述的计划执行装置,其中,所述预选的第一执行线程包括从用于执行所述逻辑子计划的至少两个执行线程中随机选取的执行线程。

13.如权利要求12所述的计划执行装置,其中,所述第一执行单元被进一步配置为:利用所述第一执行线程接收第一子查询结果,其中,所述第一子查询结果包括所述当前执行算子所涉及的非相关子查询所依赖的子查询的查询结果;以及利用所述第一执行线程根据所述第一子查询结果执行所述当前执行算子。

14.如权利要求11所述的计划执行装置,其中,所述当前执行算子包括目标执行算子,所述目标执行算子与所述当前执行算子的前一个执行算子涉及同一非相关子查询,所述预选的第一执行线程包括执行所述前一个执行算子的执行线程。

15.如权利要求14所述的计划执行装置,其中,所述第一执行单元被进一步配置为:阻塞至少一个所述第二执行线程,以等待所涉及的非相关子查询的第二子查询结果。

16.如权利要求11所述的计划执行装置,其中,所述计划执行装置还包括:第二执行单元,被配置为响应于所述当前执行算子不属于涉及非相关子查询的执行算子,利用所述第一执行线程和至少一个所述第二执行线程并行执行所述当前执行算子。

17.一种用于在分布式数据库进行数据查询的数据查询引擎装置,包括:查询语句接收装置,被配置为接收用户提供的数据查询语句;

计划生成装置,被配置为根据所接收的数据查询语句生成分布式执行计划;

计划转换装置,被配置为对所述分布式执行计划进行逻辑转换得到多个逻辑子计划;

计划调度装置,被配置为按照调度顺序将所述多个逻辑子计划依次调度到对应的分布式数据存储节点;

如权利要求11到16中任一所述的用于执行分布式数据库的逻辑子计划的计划执行装置;以及查询结果提供装置,被配置为根据最顶层逻辑子计划的执行结果生成数据查询结果提供给用户。

18.一种分布式数据库系统,包括:

至少两个分布式存储节点,每个存储节点包括数据存储引擎装置以及如权利要求17所述的数据查询引擎装置。

19.一种用于执行分布式数据库的逻辑子计划的计划执行装置,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如权利要求1到8中任一所述的方法。

20.一种用于在分布式数据库进行数据查询的数据查询引擎,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如权利要求9或10所述的方法。

21.一种计算机可读存储介质,其存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1到8中任一所述的方法或者执行如权利要求9或10所述的方法。

说明书 :

分布式数据库的逻辑子计划执行方法、装置及系统

技术领域

[0001] 本说明书实施例通常涉及计算机技术领域,尤其涉及分布式数据库的逻辑子计划执行方法、计划执行装置、数据查询方法及数据查询引擎和分布式数据库。

背景技术

[0002] 分布式数据库通常由多个分布式数据存储节点组成。每个分布式数据存储节点可以包括数据查询引擎和数据存储引擎。分布式数据库通常采用share noting架构,比如,OceanBase数据库。在这种分布式数据库中,数据分布式地存储在各个数据存储引擎中。
[0003] 在对分布式数据库执行数据查询时,在分布式数据存储节点接收到数据查询语句后,该分布式数据存储节点会根据所接收的数据查询语句生成分布式执行计划,将所生成的分布式执行计划转换为多个分布式逻辑子计划(Data Flow Operation,DFO),该多个分布式逻辑子计划可以被形成为树状结构。该多个分布式逻辑子计划按照一定的逻辑顺序依次调度到多个分布式数据存储节点上并行执行,由此实现数据查询。
[0004] 然而,在一些分布式数据库的应用场景下,DFO会包含涉及非相关子查询的执行算子,比如,SPF(SUBPLAN FILTER)算子,SC GBY(SCALAR GROUP BY)算子等。由于在数据库中SQL(Structured Query Language,结构化查询语言)中存在没有依赖关系的子查询的情况下通常会生成子查询执行计划(Subplan), 且在分布式数据库中, 这种执行计划的执行逻辑通常是先计算非相关子查询的结果, 再根据子查询的结果计算主查询结果集。因而根据上述所存在的子查询、主查询计算时的先后顺序,现有技术通常是采用单线程依次执行,即该非相关子查询的执行算子所在的DFO的并行度为1,从而严重影响分布式数据库的并行执行性能。

发明内容

[0005] 鉴于上述,本说明书实施例提供了一种分布式数据库的逻辑子计划执行方法、计划执行装置、数据查询方法及数据查询引擎和分布式数据库。利用该方法、装置,可以实现对包含涉及非相关子查询的执行算子的DFO的并行执行,提高了分布式数据库对于存在非相关子查询的局部计划的执行效率,并且减少了计算资源的浪费。
[0006] 根据本说明书的实施例的一个方面,提供一种用于执行分布式数据库的逻辑子计划的方法,包括:按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子:响应于所述当前执行算子属于涉及非相关子查询的执行算子,利用预选的第一执行线程执行所述当前执行算子,至少一个用于与所述第一执行线程共同执行所述逻辑子计划的第二执行线程等待所述当前执行算子的算子执行结果;响应于所述逻辑子计划中存在未被执行的执行算子,更新当前执行算子以及继续执行所述执行步骤;以及响应于所述逻辑子计划中不存在未被执行的执行算子,将所述当前执行算子的算子执行结果作为所述逻辑子计划的执行结果。
[0007] 根据本说明书的实施例的另一个方面,提供一种用于在分布式数据库进行数据查询的方法,所述分布式数据库包括多个分布式数据存储节点,包括:接收用户提供的数据查询语句;根据所接收的数据查询语句生成分布式执行计划;对所述分布式执行计划进行逻辑转换得到多个逻辑子计划;按照调度顺序将所述多个逻辑子计划依次调度到对应的分布式数据存储节点来按照如上所述的用于执行分布式数据库的逻辑子计划的方法执行;以及根据最顶层逻辑子计划的执行结果生成数据查询结果提供给用户。
[0008] 根据本说明书的实施例的又一个方面,提供一种用于执行分布式数据库的逻辑子计划的计划执行装置,包括:第一执行单元,被配置为按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子:响应于所述当前执行算子属于涉及非相关子查询的执行算子,利用预选的第一执行线程执行所述当前执行算子,至少一个用于与所述第一执行线程共同执行所述逻辑子计划的第二执行线程等待所述当前执行算子的算子执行结果;当前算子更新单元,被配置为响应于所述逻辑子计划中存在未被执行的执行算子,更新当前执行算子;结果生成单元,被配置为响应于所述逻辑子计划中不存在未被执行的执行算子,将所述当前执行算子的算子执行结果作为所述逻辑子计划的执行结果。
[0009] 根据本说明书的实施例的再一个方面,提供一种用于在分布式数据库进行数据查询的数据查询引擎,包括:查询语句接收装置,被配置为接收用户提供的数据查询语句;计划生成装置,被配置为根据所接收的数据查询语句生成分布式执行计划;计划转换装置,被配置为对所述分布式执行计划进行逻辑转换得到多个逻辑子计划;计划调度装置,被配置为按照调度顺序将所述多个逻辑子计划依次调度到对应的分布式数据存储节点;如上所述的用于执行分布式数据库的逻辑子计划的计划执行装置;以及查询结果提供装置,被配置为根据最顶层逻辑子计划的执行结果生成数据查询结果提供给用户。
[0010] 根据本说明书的实施例的另一方面,提供一种分布式数据库,包括:至少两个分布式存储节点,每个存储节点包括数据存储引擎以及如上所述的数据查询引擎。
[0011] 根据本说明书的实施例的再一方面,提供一种用于执行分布式数据库的逻辑子计划的计划执行装置,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如上所述的用于执行分布式数据库的逻辑子计划的方法。
[0012] 根据本说明书的实施例的又一方面,提供一种用于在分布式数据库进行数据查询的数据查询引擎,包括:至少一个处理器,与所述至少一个处理器耦合的存储器,以及存储在所述存储器上的计算机程序,所述至少一个处理器执行所述计算机程序来实现如上所述的用于在分布式数据库进行数据查询的方法。
[0013] 根据本说明书的实施例的另一方面,提供一种计算机可读存储介质,其存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的用于执行分布式数据库的逻辑子计划的方法和/或用于在分布式数据库进行数据查询的方法。
[0014] 根据本说明书的实施例的另一方面,提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行来实现如上所述的用于执行分布式数据库的逻辑子计划的方法和/或用于在分布式数据库进行数据查询的方法。

附图说明

[0015] 通过参照下面的附图,可以实现对于本说明书内容的本质和优点的进一步理解。在附图中,类似组件或特征可以具有相同的附图标记。
[0016] 图1示出了根据本说明书的实施例的分布式数据库系统的示例性架构。
[0017] 图2示出了根据本说明书的实施例的用于在分布式数据库进行数据查询的方法的一个示例的流程图。
[0018] 图3示出了根据本说明书的实施例的分布式执行计划的一个示例的示意图。
[0019] 图4示出了根据本说明书的实施例的分布式执行计划对应的逻辑子计划的树状结构的一个示例的示意图。
[0020] 图5示出了根据本说明书的实施例的用于执行分布式数据库的逻辑子计划的方法的一个示例的流程图。
[0021] 图6示出了根据本说明书的实施例的用于执行分布式数据库的逻辑子计划的方法的一个示例的示意图。
[0022] 图7示出了根据本说明书的实施例的利用预选的第一执行线程执行当前执行算子的执行过程的一个示例的流程图。
[0023] 图8示出了根据本说明书的实施例的分布式数据库的数据查询过程的一个示例的示意图。
[0024] 图9示出了根据本说明书的实施例的分布式数据库的数据查询引擎的方框示意图。
[0025] 图10示出了根据本说明书的实施例的分布式数据库的用于执行分布式数据库的逻辑子计划的计划执行装置的方框示意图。
[0026] 图11示出了根据本说明书的实施例的基于计算机系统实现的用于执行分布式数据库的逻辑子计划的计划执行装置的示例示意图。
[0027] 图12示出了根据本说明书的实施例的基于计算机系统实现的数据查询引擎的示例示意图。

具体实施方式

[0028] 以下将参考示例实施方式讨论本文描述的主题。应该理解,讨论这些实施方式只是为了使得本领域技术人员能够更好地理解从而实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者示例的限制。可以在不脱离本说明书实施例内容的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个示例可以根据需要,省略、替代或者添加各种过程或组件。另外,相对一些示例所描述的特征在其它例子中也可以进行组合。
[0029] 如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其他实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其他的定义,无论是明确的还是隐含的。除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
[0030] 在本说明书中,术语“分布式执行计划”可以用来描述数据库系统针对某条查询语句(例如SQL语句)进行涉及分布式数据库中多表或多分区查询的执行过程。
[0031] 在本说明书中,术语“逻辑子计划(DFO)”可以指对针查询语句所生成的分布式计划进行切分后所得到的计划单元。通常,DFO中可以包括可按照一定执行顺序进行执行的多个执行算子。可选地,通过一定的调度的方式,执行计划的 DFO 之间和 DFO 内部均可以实现并发执行,以提高查询效率。
[0032] 下面将结合附图来详细描述根据本说明书实施例的分布式数据库的逻辑子计划执行方法、执行装置、数据查询方法及数据查询引擎和分布式数据库。
[0033] 图1示出了根据本说明书实施例的分布式数据库的逻辑子计划执行方法、执行装置、数据查询方法及数据查询引擎和分布式数据库的示例性架构100。
[0034] 图1示出了分布式数据库100的示例示意图。如图1所示,分布式数据库系统100包括多个存储节点10‑1到10‑4。存储节点10‑1到10‑4为分布式存储节点,每个存储节点包括数据查询引擎和数据存储引擎。要说明的是,图1示出的示例仅仅是例示性的。在其它实施例中,分布式数据库系统100可以包括更多或更少的存储节点。
[0035] 分布式数据库100例如可以采用share noting架构,比如,OceanBase数据库。在这种分布式数据库中,数据分布式地存储在各个存储节点的存储引擎中。例如,数据可以被分割为多个数据分区(也可以称为数据分块),所分割出的数据分区分别存储到不同的存储引擎中。每个存储引擎可以存储一个或多个数据分区。每个存储节点上涉及的数据访问所需要的CPU资源和IO资源都发生在本地,由该存储节点上的数据查询引擎执行。
[0036] 在进行数据查询时,分布式数据库中的一个存储节点充当分布式执行计划的调度节点,调度节点的数据查询引擎接收到数据查询语句并生成分布式执行计划后,会将分布式执行计划逻辑转换为多个逻辑子计划(例如,按照语义进行逻辑转换)。在完成DFO转换后,调度节点处的数据查询引擎可以将所生成的DFO并行调度给多个存储节点(例如可以称为“计划执行节点”),各个计划执行节点可以分别启用一个或多个执行线程来尽可能并行执行所调度的DFO。
[0037] 应当理解,图1中所示的所有网络实体都是示例性的,根据具体的应用需求,分布式数据库100的架构中可以涉及任何其它网络实体。
[0038] 图2示出了根据本说明书的实施例的用于在分布式数据库进行数据查询的方法200的流程图。
[0039] 在进行数据查询时,如图2所示,在210,接收用户提供的数据查询语句。在一个示例中,可以经由用户所连接的存储节点处的数据查询引擎的输入接口、输入单元或输入装置来接收用户提供的数据查询语句。例如,可以经由数据查询引擎的客户端界面上的输入框来接收用户输入的数据查询语句等。例如,在一个示例中,数据查询例如可以是SQL查询,以及数据查询语句可以包括SQL语句,比如,所接收的SQL语句例如可以为“select /*+ parallel(2)*/* from t1 A, (select t1.v2 from t1 where t1.v1 < (select sum(v1) from t2) group by t1.v2) B where A.v1 = B.v2”。
[0040] 在220,根据所接收的数据查询语句生成分布式执行计划。例如,在调度节点处,可以利用数据查询引擎中的优化器,根据所接收的数据查询语句生成分布式执行计划。分布式执行计划例如可以包括SQL执行计划,该SQL执行计划可以具有由多个SQL算子组成的树状结构。SQL算子是构成SQL执行计划的基本组成单元,用来描述与具体SQL语义对应的基础操作,比如,TABLE SCAN算子、TABLE INSERT算子、TABLE UPDATE算子、TABLE DELETE算子、JOIN算子、GROUP BY算子、ORDER BY算子、EXCHANGE算子等。相应地,优化器可以是SQL优化器。图3示出了针对上面描述的SQL语句的SQL执行计划的示例的示意图。在一个示例中,用户所连接的存储节点可以充当调度节点。在其它示例中,调度节点也可以是其它存储节点。在这种情况下,用户所连接的存储节点可以将所接收的数据查询语句发送给调度节点。
[0041] 在230,对分布式执行计划进行逻辑转换得到多个逻辑子计划。例如,可以在调度节点处,经由数据查询引擎将根据SQL语义将SQL执行计划逻辑转换为多个逻辑子计划。相应地,每个逻辑子计划通常可以对应有负责调度该逻辑子计划的PX COORD算子。针对图3中示出的SQL执行计划,可以以EXCHANGE OUT算子(发送算子)/ EXCHANGE IN算子(接收算子)为边界来逻辑转换SQL执行计划,得到4个DFO。所得到的每个DFO可以包括多个可执行的算子,例如,多个SQL算子。在本实施例中,各个DFO在不冲突的情况下可以并行处理。各个DFO中的每个SQL算子在不冲突的情况下也可以并行处理。在一个示例中,多个逻辑子计划可以被形成为树状结构。上述逻辑子计划的调度顺序可以根据上述逻辑子计划的树状结构确定。
[0042] 针对图3示出的SQL执行计划,分布式执行计划经逻辑转换后所得到的具有树状结构的多个DFO可以如图4所示。所生成的树状结构的DFO之间存在层次关系。如果第一DFO执行时需要使用第二DFO的DFO处理结果,则第一DFO称为上层DFO或父DFO(Parent DFO),而第二DFO称为下层DFO或子DFO。在生成DFO后,还可以生成DFO的调度顺序。DFO的调度顺序可以基于DFO的树状结构生成。DFO的调度顺序可以包括DFO的遍历调度顺序,即,基于遍历策略确定出的调度顺序。
[0043] 可见,15号算子‑18号算子构成了由充当查询协调者(Query Coordinator,QC)的0号PX COORD算子(例如可以记为PX0算子)负责调度的DFO0,10号算子‑12号算子构成了由9号PX COORD算子(例如可以记为PX1算子)负责调度的DFO0,4号算子‑8号算子、13号算子和14号算子构成了由PX0算子负责调度的DFO1,1号算子‑3号算子、19号算子和20号算子构成了由PX0算子负责调度的DFO2。整个分布式执行计划的调度顺序可以为:[PX0_DFO0, PX0_DFO1]‑>[PX1_DFO0]‑>[PX0_DFO1, PX0_DFO2]。
[0044] 接着,在240,按照调度顺序将当前未调度的逻辑子计划调度到对应的分布式数据存储节点(例如各个计划执行节点)来执行。例如,调度节点可以按照上述整个分布式执行计划所指示的各个DFO的调度顺序将DFO尽可能地并行调度到相应的计划执行节点,以由相应的计划执行节点执行所接收的DFO。例如,可以由计划执行节点的数据查询引擎并行执行所接收的DFO。当接收到DFO后,每个计划执行节点可以从各自的空闲线程池中启用一个或多个空闲线程来并行执行所接收的DFO。每个计划执行节点所启用的线程可以称为执行线程。每个计划执行节点所启用的执行线程可以包括一个或多个线程。各个计划执行节点执行所接收的DFO(例如当前DFO)的具体执行过程将在下面参照图5进行描述。
[0045] 在250,响应于当前逻辑子计划执行完成,判断调度是否完成。例如,各个计划执行节点在执行完当前DFO后可以生成当前DFO的执行结果。可选地,计划执行节点还可以将所生成的当前DFO的执行结果提供给上述调度节点,以使调度节点可以确定该计划执行节点已完成对当前DFO的执行。可选地,计划执行节点还可以将所生成的当前DFO的执行结果提供给用于执行当前DFO的父DFO的计划执行节点。此时,调度节点也可以通过RPC(Remote Procedure Call,远程过程调用)确定该计划执行节点已完成对当前DFO的执行。如果针对上述整个分布式执行计划的所有DFO都完成调度处理,则在260,根据最顶层逻辑子计划的处理结果生成数据查询结果提供给用户。例如,当各个DFO均执行完毕且不存在剩余部分计算,查询协调者(QC)可以将最顶层DFO(即,Root DFO)的处理结果作为数据查询结果提供给用户。再例如,当各个DFO均执行完毕且存在剩余部分计算(例如一个并行的COUNT算法最终需要QC将各个节点上的计算结果进行求和运算),查询协调者(QC)可以根据最顶层DFO(即,Root DFO)的处理结果继续执行剩余部分的计算,生成最终的查询结果作为数据查询结果提供给用户。如果还存在未调度的DFO,则返回240,调度节点可以按照上述整个分布式执行计划所指示的各个DFO的调度顺序将下一个未调度的DFO调度到相应的计划执行节点。之后,可以循环执行240、250,直至在260输出数据查询结果。
[0046] 图5示出了根据本说明书的实施例的用于执行分布式数据库的逻辑子计划的方法500的一个示例的流程图。在下面的描述中,用于执行分布式数据库的逻辑子计划的方法可以由计划执行节点来执行。上述计划执行节点可以是分布式数据库中的分布式存储节点。
计划执行节点所启用的一个执行线程可以称为第一执行线程。用于与上述第一执行线程共同执行当前DFO的其它执行线程可以称为第二执行线程。第二执行线程可以包括至少一个执行线程。例如,第二执行线程可以包括与第一执行线程位于同一计划执行节点的执行线程和/或与第一执行线程位于不同计划执行节点的执行线程。
[0047] 如图5所示,在510,按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子。在本实施例中,参照前述实施例所描述的,逻辑子计划可以用于指示执行算子的执行顺序。参照图6,在一个示例中,由PX0算子所调度的DFO1所指示的执行算子的执行顺序例如可以是:14号算子‑>13号算子‑>7号算子‑>8号算子‑>6号算子‑>5号算子‑>4号算子。当逐算子执行时,当前待执行的执行算子可以称为“当前执行算子”。可以理解,随着执行过程的推移,“当前执行算子”可以按照所接收的逻辑子计划所指示的执行算子的执行顺序进行更新。
[0048] 在520,判断当前执行算子是否属于涉及非相关子查询的执行算子。计划执行节点可以通过各种方式判断当前执行算子是否属于涉及非相关子查询的执行算子。例如,可以根据当前执行算子的名称和所接收的逻辑子计划所指示的执行算子的执行顺序来判断。作为示例,参照图6,当执行至14号算子时,计划执行节点可以判断当前执行算子属于涉及非相关子查询的执行算子。当执行至13号算子时,计划执行节点可以判断当前执行算子属于涉及非相关子查询的执行算子。当执行至6号算子时,计划执行节点可以判断当前执行算子不属于涉及非相关子查询的执行算子。
[0049] 在本实施例的一些可选的实现方式中,上述当前执行算子可以包括目标执行算子。上述目标执行算子可以与上述当前执行算子的前一个执行算子涉及同一非相关子查询。作为示例,参照图6,由于13号算子与其前一个执行算子(14号算子)涉及同一非相关子查询,则当执行至13号算子时,13号算子即为目标执行算子。
[0050] 在530,响应于当前执行算子属于涉及非相关子查询的执行算子,利用预选的第一执行线程执行当前执行算子。例如,计划执行节点可以在判断当前执行算子属于涉及非相关子查询的执行算子时,利用预选的第一执行线程执行当前执行算子。
[0051] 在一个示例中,上述第一执行线程例如可以是预先指定的线程。可选地,上述预选的第一执行线程可以是从用于执行上述逻辑子计划的至少两个执行线程中随机选取的执行线程(例如图6所示的PX线程1)。可选地,上述预选的第一执行线程可以是根据负载平衡策略,从用于执行上述逻辑子计划的至少两个执行线程中选取的空闲的执行线程。
[0052] 在本实施例的一些可选的实现方式中,当当前执行算子为目标执行算子时,预选的第一执行线程可以为执行上述前一个执行算子的执行线程。例如,当执行至13号算子时,预选的第一执行线程为执行14号算子的执行线程。
[0053] 基于此,可以通过将涉及同一非相关子查询的执行算子由同一执行线程来执行,从而节省了选取线程和数据(如中间结果)传递的开销,有效地提升了逻辑子计划的执行效率。
[0054] 在本实施例的一些可选的实现方式中,上述第一执行线程还可以通过各种方式将当前执行算子的算子执行结果发送给至少一个第二执行线程。例如,上述第一执行线程可以将当前执行算子的算子执行结果发送给查询协调者(QC),再由QC将算子执行结果广播给其他执行线程。再例如,上述第一执行线程还可以直接将当前执行算子的算子执行结果通过RPC方式发送给至少一个第二执行线程。
[0055] 在540,至少一个用于与第一执行线程共同执行逻辑子计划的第二执行线程等待当前执行算子的算子执行结果。例如,在计划执行节点,至少一个用于与第一执行线程共同执行逻辑子计划的第二执行线程(例如图6中的PX线程2 PX线程m)可以通过各种方式等待~上述第一执行线程执行当前执行算子所得到的算子执行结果。
[0056] 在本实施例的一些可选的实现方式中,当当前执行算子为目标执行算子时,预选的第一执行线程可以为执行上述前一个执行算子的执行线程。在计划执行节点,可以阻塞至少一个上述第二执行线程,以等待所涉及的非相关子查询的第二子查询结果。
[0057] 基于此,由于涉及同一非相关子查询的执行算子均由同一执行线程(如第一执行线程)来执行,其他线程阻塞等待第二子查询结果。其中,上述第二子查询结果可以为所涉及的非相关子查询的子查询结果。从而,可以避免由于重复计算而产生的计算资源浪费,并且通过阻塞线程保证了可以迅速恢复并行。
[0058] 可选地,在一个示例中,上述第一执行线程还可以通过各种方式将当前执行算子所涉及的非相关子查询的第二子查询结果发送给至少一个第二执行线程。例如,上述第一执行线程可以将上述第二子查询结果发送给查询协调者(QC),再由QC将第二子查询结果广播给其他执行线程。再例如,上述第一执行线程还可以直接将第二子查询结果通过RPC方式发送给至少一个第二执行线程。
[0059] 可选地,在580,响应于当前执行算子不属于涉及非相关子查询的执行算子,利用第一执行线程和至少一个第二执行线程并行执行当前执行算子。例如,如图6所示,当执行至6号算子时,PX线程1 PX线程m可以并行执行6号算子。~
[0060] 基于此,可以尽可能并行执行允许并行执行的执行算子,从而提升逻辑子计划的执行效率。
[0061] 在550,判断逻辑子计划中是否存在未被执行的执行算子。在本实施例中,计划执行节点可以通过各种方式判断逻辑子计划中是否存在未被执行的执行算子。例如,可以确定是否遍历上述逻辑子计划中的执行算子。再例如,可以根据逻辑子计划的树状结构确定是否存在未被执行的执行算子。
[0062] 在560,响应于逻辑子计划中存在未被执行的执行算子,更新当前执行算子以及继续执行上述步骤520‑步骤550。例如,参见前述,计划执行节点可以按照所接收的逻辑子计划所指示的执行算子的执行顺序来更新当前执行算子。
[0063] 在570,响应于逻辑子计划中不存在未被执行的执行算子,将当前执行算子的算子执行结果作为逻辑子计划的执行结果。例如,计划执行节点可以将当前执行算子(例如图6所示的4号算子)的算子执行结果作为当前所执行的逻辑子计划的执行结果。
[0064] 在本实施例的一些可选的实现方式中,上述分布式数据库可以包括多个分布式数据存储节点。上述第二执行线程可以包括与上述第一执行线程位于同一分布式数据存储节点的执行线程和/或与上述第一执行线程位于不同分布式数据存储节点的执行线程。
[0065] 在本实施例的一些可选的实现方式中,上述逻辑子计划可以通过以数据重分布点为边界对分布式执行计划进行逻辑转换得到。上述执行算子可以包括数据处理算子和/或数据交换算子,并且上述数据处理算子和/或数据交换算子之间形成树状结构以上述逻辑子计划为单位被调度到上述分布式数据库中的多个分布式数据存储节点并行处理。
[0066] 图7示出了根据本说明书的实施例的利用预选的第一执行线程执行当前执行算子的执行过程700的一个示例的流程图。
[0067] 如图7所示,在710,利用第一执行线程接收第一子查询结果。其中,上述第一子查询结果可以包括上述当前执行算子所涉及的非相关子查询所依赖的子查询的查询结果。在一个示例中,参见图4,当当前执行算子是14号算子时,由于14号算子所在的DFO1是PX0算子所调度的DFO0的父查询,因而当前执行算子所涉及的非相关子查询所依赖的子查询可以是PX0算子所调度的DFO0,从而上述第一子查询结果可以是PX0算子所调度的DFO0的执行结果。可见,计划执行节点可以利用如前述实施例所描述的第一执行线程接收上述第一子查询结果。从而可以为执行当前执行算子提供数据基础。
[0068] 在720,利用第一执行线程根据第一子查询结果执行当前执行算子。例如,计划执行节点可以利用上述第一执行线程根据所接收的第一子查询结果来执行当前执行算子。从而可以减少因数据传递而引起的通信开销。
[0069] 在本实施例的一些可选的实现方式中,上述第一执行线程还可以通过各种方式将当前执行算子的算子执行结果发送给至少一个第二执行线程。例如,上述第一执行线程可以将当前执行算子的算子执行结果发送给查询协调者(QC),再由QC将算子执行结果广播给其他执行线程。再例如,上述第一执行线程还可以直接将当前执行算子的算子执行结果通过RPC方式发送给至少一个第二执行线程。
[0070] 图8示出了数据查询过程的一个示例的示意图。在图8的示例中,在进行数据查询时,接收到用户发起的数据查询语句的分布式存储节点(例如图8中的节点1)中的PX 算子(PX Operator)充当查询协调者(QC)。在一个示例中,上述PX算子例如可以是前述实施例中的PX0算子。可以参照如前述图2所描述的实施例中步骤220、230得到多个DFO。对于每个DFO,当该DFO需要并行执行时,负责调度该DFO的PX算子(例如前述实施例中的PX0算子、PX1算子)可以根据预设的并行度将该DFO分发到上述数据查询语句所涉及的数据所在数据分区的分布式存储节点。例如,上述PX算子可以将当前DFO以RPC的方式分发到如图8中的节点2 节点K。再例如,上述PX算子也可以将当前DFO发送到本地(如图8中的节点1)。上述节点1~ ~
节点K可以参照如前述图5或图7所描述的实施例中的用于执行分布式数据库的逻辑子计划的方法。通常,当作为计划执行节点的存储节点执行完毕当前DFO,可以将当前DFO的执行结果提供给用于执行当前DFO的父DFO的计划执行节点。从而,当所调度的DFO均执行完毕,参照前述图2实施例的描述,作为QC的PX算子可以得到最顶层DFO的处理结果并最终生成数据查询结果。最后,查询协调者(QC)所在的存储节点(例如图8所示的节点1)可以输出数据查询结果,从而完成整个数据查询过程。
[0071] 利用图1‑图8中公开的分布式数据库的逻辑子计划执行方法和数据查询方法,可以采用第一执行线程执行涉及非相关子查询的执行算子,其他执行线程等待该执行算子的执行结果的方式,既避免了采用并行方式因将子查询作为filter(过滤)而重复计算导致的资源浪费,又可以通过其他线程的等待而非仅采用单线程来为其他可并行执行算子的并行执行提供线程资源储备。从而可以在减少资源使用的前提下获得更好的执行性能,尤其在涉及非相关子查询的大规模数据查询中,可以显著提升数据查询系统的执行性能。
[0072] 图9示出了根据本说明书的实施例的用于在分布式数据库进行数据查询的数据查询引擎900的一个示例的方框图。该装置实施例可以与图2、图8所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
[0073] 如图9所示,用于在分布式数据库进行数据查询的数据查询引擎900可以包括查询语句接收装置910、计划生成装置920、计划转换装置930、计划调度装置940、计划执行装置950和查询结果提供装置960。
[0074] 查询语句接收装置910,被配置为接收用户提供的数据查询语句。查询语句接收装置910的操作可以参考上面图2描述的210的操作。
[0075] 计划生成装置920,被配置为根据所接收的数据查询语句生成分布式执行计划。计划生成装置920的操作可以参考上面图2描述的220的操作。
[0076] 计划转换装置930,被配置为对分布式执行计划进行逻辑转换得到多个逻辑子计划。计划转换装置930的操作可以参考上面图2描述的230的操作。
[0077] 计划调度装置940,被配置为按照调度顺序将多个逻辑子计划依次调度到对应的分布式数据存储节点。计划调度装置940的操作可以参考上面图2描述的步骤240、步骤250的操作。
[0078] 在一个示例中,多个逻辑子计划可以被形成为树状结构。上述逻辑子计划的调度顺序可以根据上述逻辑子计划的树状结构确定。
[0079] 计划执行装置950,被配置为响应于逻辑子计划中存在未被执行的执行算子,更新当前执行算子。计划执行装置950的操作可以参考上面图5‑图7描述的方法。计划执行装置950的具体描述将在下面参照图10进行描述。
[0080] 查询结果提供装置960,被配置为根据最顶层逻辑子计划的执行结果生成数据查询结果提供给用户。查询结果提供装置960的操作可以参考上面图2描述的步骤260的操作。
[0081] 图10示出了根据本说明书的实施例的用于执行分布式数据库的逻辑子计划的计划执行装置1000的一个示例的方框图。该装置实施例可以与图5‑图7所示的方法实施例相对应,该装置具体可以应用于各种电子设备中。
[0082] 如图10所示,用于执行分布式数据库的逻辑子计划的计划执行装置1000可以包括第一执行单元1010、当前算子更新单元1020和结果生成单元1030。
[0083] 第一执行单元1010,被配置为按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子:响应于当前执行算子属于涉及非相关子查询的执行算子,利用预选的第一执行线程执行当前执行算子,至少一个用于与第一执行线程共同执行逻辑子计划的第二执行线程等待当前执行算子的算子执行结果。第一执行单元1010的操作可以参考上面图5描述的步骤510至步骤540的操作。
[0084] 在一个示例中,预选的第一执行线程可以包括从用于执行逻辑子计划的至少两个执行线程中随机选取的执行线程。
[0085] 在一个示例中,上述第一执行单元1010可以被进一步配置为:利用第一执行线程接收第一子查询结果,其中,第一子查询结果包括当前执行算子所涉及的非相关子查询所依赖的子查询的查询结果;以及利用第一执行线程根据第一子查询结果执行当前执行算子。
[0086] 在一个示例中,当前执行算子可以包括目标执行算子。上述目标执行算子可以与当前执行算子的前一个执行算子涉及同一非相关子查询。上述预选的第一执行线程可以包括执行前一个执行算子的执行线程。
[0087] 在一个示例中,上述第一执行单元1010可以被进一步配置为:阻塞至少一个第二执行线程,以等待所涉及的非相关子查询的第二子查询结果。
[0088] 当前算子更新单元1020,被配置为响应于所述逻辑子计划中存在未被执行的执行算子,更新当前执行算子。当前算子更新单元1020的操作可以参考上面图5描述的步骤550、560的操作。
[0089] 结果生成单元1030,被配置为响应于逻辑子计划中不存在未被执行的执行算子,将当前执行算子的算子执行结果作为逻辑子计划的执行结果。结果生成单元1030的操作可以参考上面图5描述的步骤550、570的操作。
[0090] 在一个示例中,上述计划执行装置1000还可以包括:第二执行单元(图10中未示出),被配置为响应于当前执行算子不属于涉及非相关子查询的执行算子,利用第一执行线程和至少一个第二执行线程并行执行当前执行算子。上述第二执行单元的操作可以参考上面图5描述的步骤520、580的操作。
[0091] 在一个示例中,上述分布式数据库可以包括多个分布式数据存储节点。上述第二执行线程可以包括与第一执行线程位于同一分布式数据存储节点的执行线程和/或与上述第一执行线程位于不同分布式数据存储节点的执行线程。
[0092] 在一个示例中,上述逻辑子计划可以通过以数据重分布点为边界对分布式执行计划进行逻辑转换得到。上述执行算子可以包括数据处理算子和/或数据交换算子。并且上述数据处理算子和/或数据交换算子之间可以形成树状结构以逻辑子计划为单位被调度到分布式数据库中的多个分布式数据存储节点并行处理。
[0093] 以上参照图1到图10,对根据本说明书实施例的分布式数据库的逻辑子计划执行方法、计划执行装置、数据查询方法及数据查询引擎和分布式数据库的实施例进行了描述。
[0094] 本说明书实施例的用于执行分布式数据库的逻辑子计划的计划执行装置和用于在分布式数据库进行数据查询的数据查询引擎可以采用硬件实现,也可以采用软件或者硬件和软件的组合来实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将存储器中对应的计算机程序指令读取到内存中运行形成的。在本说明书实施例中,用于执行分布式数据库的逻辑子计划的计划执行装置和用于在分布式数据库进行数据查询的数据查询引擎例如可以利用基于计算机系统的电子设备实现。
[0095] 图11示出了本说明书的实施例的用于执行分布式数据库的逻辑子计划的计划执行装置1100的示意图。
[0096] 如图11所示,计划执行装置1100可以包括至少一个处理器1110、存储器(例如,非易失性存储器)1120、内存1130和通信接口1140,并且至少一个处理器1110、存储器1120、内存1130和通信接口1140经由总线1150连接在一起。至少一个处理器1110执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
[0097] 在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器1110:按照所接收的逻辑子计划所指示的执行算子的执行顺序,通过以下执行步骤执行当前执行算子:响应于所述当前执行算子属于涉及非相关子查询的执行算子,利用预选的第一执行线程执行所述当前执行算子,至少一个用于与所述第一执行线程共同执行所述逻辑子计划的第二执行线程等待所述当前执行算子的算子执行结果;响应于所述逻辑子计划中存在未被执行的执行算子,更新当前执行算子以及继续执行所述执行步骤;以及响应于所述逻辑子计划中不存在未被执行的执行算子,将所述当前执行算子的算子执行结果作为所述逻辑子计划的执行结果。
[0098] 应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器1110进行本说明书的各个实施例中以上结合图5‑7描述的各种操作和功能。
[0099] 图12示出了本说明书的实施例的用于在分布式数据库进行数据查询的数据查询引擎1200的示意图。
[0100] 如图12所示,数据查询引擎1200可以包括至少一个处理器1210、存储器(例如,非易失性存储器)1220、内存1230和通信接口1240,并且至少一个处理器1210、存储器1220、内存1230和通信接口1240经由总线1250连接在一起。至少一个处理器1210执行在存储器中存储或编码的至少一个计算机可读指令(即,上述以软件形式实现的元素)。
[0101] 在一个实施例中,在存储器中存储计算机可执行指令,其当执行时使得至少一个处理器1210:接收用户提供的数据查询语句;根据所接收的数据查询语句生成分布式执行计划;对所述分布式执行计划进行逻辑转换得到多个逻辑子计划;按照调度顺序将所述多个逻辑子计划依次调度到对应的分布式数据存储节点来按照如前所述的用于执行分布式数据库的逻辑子计划的方法执行;以及根据最顶层逻辑子计划的执行结果生成数据查询结果提供给用户。
[0102] 应该理解,在存储器中存储的计算机可执行指令当执行时使得至少一个处理器1210进行本说明书的各个实施例中以上结合图1‑4和图8描述的各种操作和功能。
[0103] 根据一个实施例,提供了一种例如计算机可读介质的程序产品。计算机可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被计算机执行时,使得计算机执行本说明书的各个实施例中以上结合图1‑8描述的各种操作和功能。
[0104] 具体地,可以提供配有可读存储介质的系统或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
[0105] 在这种情况下,从可读介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此机器可读代码和存储机器可读代码的可读存储介质构成了本发明的一部分。
[0106] 本说明书各部分操作所需的计算机程序代码可以用任意一种或多种程序语言编写,包括面向对象编程语言,如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB、NET以及Python等,常规程序化编程语言如C语言、Visual Basic 2003、Perl、COBOL 2002、PHP以及ABAP,动态编程语言如Python、Ruby和Groovy,或者其他编程语言等。该程序编码可以在用户计算机上运行,或者作为独立的软件包在用户计算机上运行,或者部分在用户计算机上运行另一部分在远程计算机运行,或者全部在远程计算机或服务器上运行。在后一种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或者在云计算环境中,或者作为服务使用,比如软件即服务(SaaS)。
[0107] 可读存储介质的实施例包括软盘、硬盘、磁光盘、光盘(如CD‑ROM、CD‑R、CD‑RW、DVD‑ROM、DVD‑RAM、DVD‑RW、DVD‑RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上或云上下载程序代码。
[0108] 上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0109] 上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。各步骤的执行顺序不是固定的,可以根据需要进行确定。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
[0110] 在整个本说明书中使用的术语“示例性”意味着“用作示例、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
[0111] 以上结合附图详细描述了本说明书的实施例的可选实施方式,但是,本说明书的实施例并不限于上述实施方式中的具体细节,在本说明书的实施例的技术构思范围内,可以对本说明书的实施例的技术方案进行多种简单变型,这些简单变型均属于本说明书的实施例的保护范围。
[0112] 本说明书内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本说明书内容。对于本领域普通技术人员来说,对本说明书内容进行的各种修改是显而易见的,并且,也可以在不脱离本说明书内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本说明书内容并不限于本文所描述的示例和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。