首页> 中国专利> 使用具有规范形式的逻辑查询步骤进行查询处理

使用具有规范形式的逻辑查询步骤进行查询处理

摘要

一种查询处理设备,包括:通信接口,用于访问数据库和数据库目录;存储器,用于存储指令;以及处理器,耦合至所述存储器和所述通信接口。所述处理器执行所述指令以:解析查询以为所述查询生成第一和第二执行计划;从所述数据库目录中检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值;从所述第一执行计划或所述第二执行计划中选择执行计划,基于所述先前确定的基数值,所述选定的执行计划具有较低的成本;以及对从所述数据库访问的数据执行所述选定的执行计划。所述查询处理系统将在执行所述逻辑步骤期间确定的实际基数值存储在所述数据库目录中以供后续查询使用。因此,所述查询处理设备可以重复使用先前确定的基数值。

著录项

  • 公开/公告号CN113874832A

    专利类型发明专利

  • 公开/公告日2021-12-31

    原文格式PDF

  • 申请/专利权人 华为技术有限公司;

    申请/专利号CN202080023252.X

  • 申请日2020-03-19

  • 分类号G06F7/00(20060101);

  • 代理机构

  • 代理人

  • 地址 518129 广东省深圳市龙岗区坂田华为总部办公楼

  • 入库时间 2023-06-19 13:27:45

说明书

相关申请案交叉引用

本申请要求于2019年3月22日递交的发明名称为“使用具有规范形式的逻辑查询步骤进行查询处理”的第62/822,463号美国临时申请案的在先申请优先权,其内容以引入的方式并入本文中。

技术领域

本发明涉及数据库管理系统(database management system,DBMS)中的查询处理,尤其涉及将查询解析为具有规范形式和存储的基数信息的逻辑步骤的DBMS。

背景技术

数据库查询优化方法使用基数和数据大小估计来在基于成本的查询优化系统中制定更好的查询。基数是对数据库特定列中数据值唯一性的度量。该列中的小基数值可能表明列中有大量重复元素。基数估计包括基表(例如,数据库列)和中间结果(例如,对基表进行运算产生的中间数据)的行数和不同值的数量。执行每个运算的输出数据量也是可以影响性能的基数值。行数、不同值的数量和数据大小在联接排序、选择联接方法类型和选择要在特定查询的执行计划中使用的聚合方法类型等操作中起着重要作用。

例如,DBMS采用两种类型的联接算法:嵌套循环联接算法和排序归并联接算法。对于示例联接运算JOIN(A,B),嵌套循环算法会将表A中的每条记录与表B中的每条记录进行比较以生成联接的表,而排序归并联接算法会将表A和表B分别排序并组合排序后的表以生成联接的表。对于相对较小的表,嵌套循环算法更高效,而对于相对较大的表,排序归并算法更高效。因此,DBMS的查询优化器将从了解要联接的表的基数中受益。

发明内容

DBMS解析查询以生成执行计划。在下文描述的示例中,执行计划是逻辑步骤的组合,这些逻辑步骤组合起来以实现数据库查询。逻辑步骤是对一个或多个数据库列起作用以产生中间结果的查询的子部分。多个逻辑步骤的结果可以在其它逻辑步骤中组合以执行完整查询。在下文描述的执行计划中,每个逻辑步骤都有一个具有完全限定列名的规范形式,在可能的情况下,列名按预定顺序(例如,字母顺序)排列。执行计划后,DBMS在数据库目录中存储执行计划和构成执行计划的逻辑步骤的统计数据。存储的统计数据通过从步骤的规范形式派生的相应哈希值进行索引。DBMS的查询优化器在处理稍后发生的包含一个或多个相同逻辑步骤的查询以选择一个或多个查询时访问这些存储的统计数据。使用从稍后发生的查询的执行计划的规范形式步骤生成的哈希值来访问统计数据。

这些示例包含在独立权利要求的特征中。进一步的实施例在从属权利要求、具体说明和附图中显而易见。

根据第一方面,一种查询处理设备,包括:通信接口,用于访问数据库和数据库目录;存储器,用于存储指令;以及处理器,耦合至所述存储器和所述通信接口。所述处理器执行以下指令:解析查询以为所述查询生成第一和第二执行计划,所述第一和第二执行计划中的每一个都包括一个或多个逻辑步骤;从所述数据库目录中检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值;从所述第一执行计划或所述第二执行计划中选择执行计划,基于所述先前确定的基数值,所述选定的执行计划具有较低的成本;通过所述通信接口对从所述数据库访问的数据执行所述选定的执行计划。

在根据所述第一方面的所述设备的第一种实现方式中,所述处理器用于以具有已定义语法并包括相应源名称的相应规范形式生成所述逻辑步骤。

在根据所述第一方面的所述设备的第二种实现方式中,所述处理器用于检索所述第一和第二执行计划的先前确定的基数值。

在根据所述第一方面的所述设备的第三种实现方式中,所述处理器用于完全限定所述第一和第二执行计划的每一个中的每个逻辑步骤的每个源名称。所述处理器还用于确定所述一个或多个逻辑步骤中的第一个逻辑步骤具有多个源名称并且是可交换的并在所述第一个逻辑步骤中按预定顺序排列所述多个源名称。

在根据所述第一方面的所述设备的第四种实现方式中,所述处理器用于确定所述第一个逻辑步骤用于运算,所述运算包括:Inner Join、Full Join、Multi-Way Join、Union或Intersect。

在根据所述第一方面的所述设备的第五种实现方式中,所述处理器用于为所述第一和第二执行计划的每个逻辑步骤计算相应的哈希值。所述处理器还用于基于所述相应的哈希值访问所述数据库目录以检索所述第一和第二执行计划的所述逻辑步骤的所述相应先前确定的基数值。

在根据所述第一方面的所述设备的第六种实现方式中,所述一个或多个逻辑步骤包括结构化查询语言(structured query language,SQL)运算,所述运算包括Scan运算、Join运算、Aggregate Scan By运算、Union运算或Intersect运算中的至少一个。

在根据所述第一方面的所述设备的第七种实现方式中,所述Join运算包括SingleJoin运算、Multi-Way Join运算、Left Outer Join运算、Semi-Join运算、Anti-Join运算和Full Outer Join运算中的至少一个。

在根据所述第一方面的所述设备的第八种实现方式中,所述处理器用于执行所述选定的执行计划的每个逻辑步骤。所述处理器还用于为每个执行的逻辑步骤获取相应的实际基数值以及为每个执行的逻辑步骤获取所述相应的哈希值。所述处理器用于将所述相应的实际基数值存储在通过所述获取的相应哈希值索引的所述数据库目录中。

在根据所述第一方面的所述设备的第九种实现方式中,所述处理器还用于估计在所述数据库目录中不具有先前确定的基数值的所述每个执行计划中的每个逻辑步骤的基数值,并基于所述检索的先前确定的基数值和所述估计的基数值来选择具所述第一执行计划或所述第二执行计划中有较低成本的所述一个。

根据第二方面,一种用于处理查询的方法,用以解析查询以为所述查询生成第一和第二执行计划,所述第一和第二执行计划中的每一个都包括一个或多个逻辑步骤。所述方法检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值,所述方法选择所述第一执行计划或所述第二执行计划中具有较低成本的一个,并对数据库中的数据执行所述选定的执行计划。

在根据所述第二方面的所述方法的第一种实现方式中,所述解析所述查询包括以具有已定义语法并包括相应源名称的相应规范形式生成所述逻辑步骤。

在根据所述第二方面的所述方法的第二种实现方式中,所述检索所述第一和第二执行计划的所述先前执行的逻辑步骤的所述先前确定的基数值还包括检索所述第一和第二执行计划的先前确定的基数值。

在根据所述第二方面的所述方法的第三种实现方式中,所述解析所述查询包括完全限定所述第一和第二执行计划的每一个中的每个逻辑步骤的每个源名称。所述方法还包括确定所述一个或多个逻辑步骤中的第一个逻辑步骤具有多个源名称并且是可交换的并在所述第一个逻辑步骤中按预定顺序排列所述多个源名称。

在根据所述第二方面的所述方法的第四种实现方式中,所述确定所述第一个逻辑步骤是可交换的包括确定所述第一个逻辑步骤用于运算,所述运算包括:Inner Join、FullJoin、Multi-Way Join、Union或Intersect。

在根据所述第二方面的所述方法的第五种实现方式中,所述方法还包括为所述第一和第二执行计划的每个逻辑步骤计算相应的哈希值,以及基于所述相应的哈希值访问数据库目录以检索所述第一和第二执行计划的所述逻辑步骤的所述相应先前确定的基数值。

在根据所述第二方面的所述方法的第六种实现方式中,所述解析所述查询包括将结构化查询语言(structured query language,SQL)查询解析为运算,所述运算包括Scan运算、Join运算、Aggregate Scan By运算、Union运算或Intersect运算中的至少一个。

在根据所述第二方面的所述方法的第七种实现方式中,所述对所述数据库中的数据执行所述选定的执行计划包括执行所述选定的执行计划的每个逻辑步骤。所述方法还包括为每个执行的逻辑步骤获取相应的实际基数值以及为每个执行的逻辑步骤获取所述相应的哈希值。所述方法还包括将所述相应的实际基数值存储在通过所述获取的相应哈希值索引的数据库目录中。

在根据所述第二方面的所述方法的第八种实现方式中,所述基于所述检索的先前确定的基数值来选择所述第一执行计划或所述第二执行计划中的一个还包括估计在数据库目录中不具有先前确定的基数值的所述每个执行计划中的每个逻辑步骤的基数值。所述方法还包括基于所述检索的先前确定的基数值和所述估计的基数值来选择所述第一执行计划或所述第二执行计划中具有较低成本的所述一个。

根据第三方面,一种存储指令的非瞬时性计算机可读介质,当所述指令由一个或多个处理器执行时,这些指令使一个或多个处理器执行以下步骤:解析查询以为所述查询生成第一和第二执行计划,所述第一和第二执行计划中的每一个都包括一个或多个逻辑步骤;检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值;从所述第一执行计划或所述第二执行计划中选择执行计划,基于所述先前确定的基数值,所述选定的执行计划具有较低的成本;以及对数据库中的数据执行所述选定的执行计划。

根据第四方面,一种查询处理设备,包括:通信接口,用于访问数据库和数据库目录;执行计划方法,用于解析查询并为所述查询生成第一和第二执行计划,所述第一和第二执行计划中的每一个都包括一个或多个逻辑步骤;基数方法,用于从所述数据库目录中检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值;选择方法,用于从所述第一执行计划或所述第二执行计划中选择执行计划,基于所述先前确定的基数值,所述选定的执行计划具有较低的成本;以及执行方法,通过所述数据库接口对从所述数据库访问的数据执行所述选定的执行计划。

附图说明

图1是一个示例实施例提供的用于处理数据库查询的系统的框图。

图2是一个示例实施例提供的查询处理方法的流程图。

图3是另一示例实施例提供的查询处理方法的流程图。

图4是一个示例实施例提供的用于执行查询处理的计算设备的框图。

具体实施方式

以下结合附图进行详细描述,所述附图是描述的一部分,并通过图解说明的方式示出可以实施本发明的具体实施例。将充分详细描述这些实施例,使本领域技术人员能够实现所公开的实施例,并且应该理解,可以使用其它实施例并且在不脱离所附权利要求书的范围的情况下可以做出结构上、逻辑上、电学上的改变。因此以下示例实施例的描述不应视为限定所附权利要求书。

由基于成本的查询优化器生成的执行计划可能对基数和数据大小估计的准确性很敏感。基于成本的查询优化器可以从多个执行计划中为查询选择一个执行计划作为具有最低成本(例如,响应时间最短、CPU和/或I/O处理成本最低和/或网络处理成本最低)的执行计划。这些成本受到正在处理的数据量(数据大小)和正在处理的不同数据值的数量(基数)的显着影响。

基数估计可能表现出相当大的变化,并可能高估或低估真实的基数和数据大小值。许多关系DBMS使用ANALYZE命令来收集基数和数据大小值。ANALYZE命令为表或表的单个列生成统计数据。除了值的总数之外,ANALYZE命令还可以返回其它统计数据,例如表或列中不同条目数的细分数据。运行ANALYZE命令可能成本很高,尤其是在大型数据集上运行时。因此,可以存储一次调用ANALYZE命令而生成的统计数据,并将其用于以后对表或列的操作。但是,在表或列经历多次插入、删除和更新之后,这些统计数据可能会变得过时,数据库管理员需要重新运行ANALYZE命令来刷新统计数据。作为使用ANALYZE命令的替代方法,DBMS可以从表的直方图获取基数数据。

谓词或联接条件中引用的相关列也可能会导致基数估计出现误差。例如,考虑以下查询:

SELECT customer_id,purchase_price FROM car_sales WHERE Maker=‘Honda’AND Model=‘Accord’

在此查询中,“Maker”和“Model”是表的单独列。但是,这些列可能具有高度相关性,因为每个汽车制造商使用的型号名称通常是该汽车制造商独有的。

基数估计误差的另一个可能来源是包含“正则表达式”的表达式。如本文所使用的,“正则表达式”是定义搜索模式的字符序列。正则表达式示例包括以下内容:

WHERE product_name LIKE‘%green%’or

WHERE o_comment NOT LIKE‘%special%requests%’

第一个表达式在数据库的产品名称字段中搜索包含字符“green”的名称。第二个表达式在数据库的其它备注字段中搜索不是特殊请求的备注。由于这些搜索的结果未知,因此很难估计使用表达式所得到的数据大小。

DBMS中的查询优化器试图从许多不同的执行计划中选择最佳执行计划。如上所述,查询优化器使用基数估计来选择最佳计划。示例实施例提供的查询优化器通过将每个复杂查询分解成多个步骤,并在执行查询时捕获复杂查询及其组成步骤的实际基数,来解决上述问题。这些基数值会被格式化并存储起来,以便可用于从包括同样查询和/或步骤的一组稍后发生的查询计划中选择最佳查询计划。

下面描述的实施例重复使用了先前查询计划执行的统计数据,以获取基数信息供日后查询使用。该解决方案包括生产者端和消费者端。生产者端捕获实际执行的基数统计数据,执行引擎将这些数据保存到DBMS的目录表中。消费者端是优化器的基数估计组件,它从目录中获取基数信息并使用该基数信息为接收到的查询选择最佳执行计划。

所述设备和方法可以重复使用先前确定的基数值,增加了选择最佳执行计划的能力。所述设备和方法可用于查询优化。所述设备和方法可用于选择执行计划。所述设备和方法可用于选择具有最低成本的执行计划。所述设备和方法可用于重复使用先前生成的基数值而不是使用基数估计。所述设备和方法可用于通过改进的统计估计来提高数据库查询性能。所述设备和方法可用于通过重复使用先前的基数值而不是依赖于基数值的估计来提高数据库查询性能。所述设备和方法可用于最大化先前执行的查询统计的可重用性。

图1是一个示例实施例提供的用于处理数据库查询的系统100的框图。所示实施例中的所述系统100包括查询源102并/或接收数据库查询。在下文描述的示例中,查询可以包括从数据库列中获取的信息、一组输入值,或包括由之前的逻辑步骤生成的中间结果。下文描述的示例使用结构化查询语言(Structured Query Language,SQL)查询,但也可以考虑使用其它查询语言。所示实施例中的所述系统100包括查询处理器104、包含基于成本的(物理层)优化器120的查询优化器110、用于与数据库130通信的通信接口132、数据库目录140和执行引擎150。在一些实施例中,所述系统100包括数据库管理系统(databasemanagement system,DBMS)技术。所述通信接口132可以同时与所述数据库130和所述数据库目录140通信或与两者之一通信。在一些实施例中,所述查询处理器104将接收到的查询解析为多个逻辑步骤以生成查询树112。查询树包括根逻辑步骤、一个或多个子逻辑步骤以及一个或多个没有子逻辑步骤的叶逻辑步骤。每个逻辑步骤都有规范形式,遵循已定义的语法,并具有按预定顺序排列的完全限定源名称。从下文描述的示例查询生成的逻辑步骤是规范的,因为逻辑步骤具有由规则定义的语法,使得包括相同逻辑步骤的两个查询生成该逻辑步骤的相同文本表示。虽然下文描述的实施例处理的是SQL查询,但可以预期其它实施例可以处理其它类型的数据库查询。

所述查询优化器110处理所述查询树中的所述逻辑步骤,以生成一个或多个查询执行计划126以供所述执行引擎150执行,例如第一执行计划和第二执行计划。为简单起见,下文将描述所述第一执行计划和所述第二执行计划,但是应当理解,可以生成任意数量的查询执行计划。为了生成一个或多个查询执行计划126,所述查询优化器110和基于成本的优化器120可以访问所述数据库目录140和/或从中接收信息。在一个示例实施例中,根据所述查询搜索的数据库表驻留在所述数据库130中。

在一些实施例中,除了生成所述查询树112之外,所述查询处理器104还检查查询102的句法结构。所述查询处理器104分析所述查询树112的语义以确定是否存在问题,例如不兼容的运算类型或引用了不存在的表。虽然在图1中未示出,但是所述查询处理器104可以访问所述数据库目录140的信息以实现这些功能。

所述查询优化器110包括逻辑层优化器114,该逻辑层优化器应用规则并检索所述查询树112中的所述逻辑步骤的基数,以基于所述检索的基数和优化规则生成所述查询树的执行计划。所述逻辑层优化器114可以计算整个查询树112和包括各个逻辑步骤的所述查询树112的子分支的各个哈希值,并基于所述哈希值访问所述数据库目录140的基数数据。由于所述查询中的所述逻辑步骤是根据规范形式生成的,如下所述,不同查询中出现的相同逻辑步骤具有相同的文本,因而具有相同的哈希值。因此,如果所述逻辑步骤的所述基数存储在所述数据库目录140中并且通过其哈希值进行索引,则所述逻辑层优化器114可以快速检索先前执行的查询和/或每个先前执行的子部分的基数。然后所述逻辑层优化器114可以生成多个执行计划122并且基于返回的基数评估不同的计划。所述执行计划122可以为逻辑步骤和/或不同类型的运算(例如,不同类型的联接运算,比如Hash Join、Nested LoopJoin或Merge Join)指定不同的执行顺序。如上所述,源和/或列的基数和/或输出结果的大小会影响所述执行计划中每个逻辑步骤的成本,从而影响整个执行计划的成本。

所述基于成本的优化器120接收所述执行计划122并将这些计划应用到计划选择模块124。所述计划选择模块124访问所述数据库目录140和基数估计模块128,以选择所述执行计划122中的一个或多个执行计划。当特定执行计划122的逻辑步骤的基数数据存储在所述数据库目录140中时,所述计划选择模块124使用存储的数据。在示例系统中,由所述逻辑层优化器114检索到的基数数据可以与所述执行计划122一起传送到所述计划选择模块124。当所述数据库目录140不包括逻辑步骤或表的基数数据时,所述基数估计模块128(例如)通过使用先前由ANALYZE命令生成的统计数据、通过对表中的数据进行采样和/或通过生成表的直方图来生成表的基数的估计。

所述计划选择模块124还访问所述数据库目录140的成本函数以估计所述执行计划122的成本。所述成本函数可以使用所述数据库目录140和/或所述基数估计模块128的基数估计和/或其它统计数据来估计执行每个计划的成本。所述计划选择模块124选择一个或多个成本成本较低的执行计划122作为所述查询执行计划126。

所述执行引擎150使用所述数据库130中的数据执行所述查询执行计划126以生成中间结果154,所述中间结果被进一步处理以生成输出结果156。作为执行所述查询执行计划126的一部分,所述执行引擎150确定所述查询的组件表和所述中间结果154的实际基数。该基数数据与相应的哈希值一起反馈到所述数据库目录140,以在闭环配置中用于优化后续查询102。

如下所述,每个SQL查询可以包括一个或多个谓词。每个谓词可以定义为数据表的给定部分满足所述执行计划122的一部分的条件。可以基于一个或多个角度来确定和/或评估此类谓词。

所述计划选择模块124选择具有最低成本的执行计划122。由于这些成本是基于基数估计的,因此更准确的基数估计可以提高所述计划选择模块124的性能。

例如,执行查询的成本可能取决于所述执行计划122中的操作的顺序。与以不同顺序评估逻辑步骤的计划相比,以一种顺序评估查询树的逻辑步骤的计划可能会产生更大的中间结果。因此,不仅需要知道源表的基数,还需要知道查询计划可能生成的任何中间表的基数。作为执行计划生成的一部分,所述逻辑层优化器114可以指定查询操作(例如,谓词评估或谓词组合)的顺序,使得执行计划中预期产生较小中间结果154的操作比预期产生较大中间结果154的查询操作更早发生。这种排序可以基于基数估计来执行,基数估计可以被视为所述中间结果的预期大小。所述执行引擎150可以在第一查询计划执行期间确定这些中间结果154的基数并使这些基数值可供所述逻辑层优化器114和/或所述计划选择模块124使用,以生成/选择用于稍后发生的查询的最佳查询执行计划。

下面的示例描述了允许所述执行引擎150在所述查询的每个逻辑步骤中捕获信息的一般逻辑规范形式。所述规范形式的逻辑步骤在生产者端生成。所述规范形式的逻辑步骤(及其对应的基数统计数据)由所述执行引擎150保存到所述数据库目录140中。在消费者端,所述查询优化器110生成包括逻辑规范形式逻辑步骤的查询树,并访问所述数据库目录140以快速找到匹配的规范形式及其相关联的基数和数据大小信息。

下面描述的示例收集有关先前执行的查询的统计数据,并使这些统计数据可用于以后发生的查询。执行计划的规范形式的逻辑步骤允许所述查询优化器110基于一组执行步骤来确定最佳执行计划,因为所述查询优化器110可以基于先前使用同样的数据库列和中间结果执行的相同步骤的实际基数快速确定执行步骤、数据库列和中间结果的基数。系统维护的统计粒度处在执行步骤级别,而不是在查询级别。此外,所述基于成本的优化器120使用基数数据来执行物理查询优化。下文描述的一般规范形式处于逻辑层。它不包括联接顺序、联接算法、分组顺序或谓词顺序等信息。然而,所收集的基数数据允许所述查询优化器110基于包含在数据库中的每个逻辑步骤的实际基数数据来选择一个或多个替代执行计划122。

所述基于成本的查询优化器110执行物理优化。下面的示例使用词语“physical”来区分由逻辑层优化器114和基于成本的查询优化器110执行的查询优化。逻辑查询优化基于先前执行的步骤检索到的基数数据来选择计划。但是,该基数数据可能并不完整,因为之前可能并未执行查询计划中的所有步骤,并且之前可能并未处理所有数据库列和中间结果。所述物理优化还考虑先前未执行的步骤的估计基数值。所述基于成本的查询优化器110还考虑联接顺序、联接算法、分组顺序和谓词顺序对执行计划成本的影响。

如下所述,每个逻辑步骤都以规范形式表示并具有相应的哈希值。可以通过将哈希函数(例如,MD5哈希函数)应用于所述逻辑步骤的文本表示来生成所述哈希值。所述哈希值允许所述逻辑层优化器114和/或所述计划选择模块124快速找到所述数据库目录140中特定逻辑步骤的统计数据。

所述哈希值及其关联的统计信息保存在所述数据库目录140中。或者,所述规范形式的逻辑步骤也可以存储在所述数据库目录140中。类似于键值哈希映射,所述查询优化器110使用规范形式逻辑步骤的匹配哈希值(例如,从逻辑步骤生成的键)在所述数据库目录140中找到相应的逻辑步骤的实际基数统计数据。如上所述,在规范形式中,表名和/或列名是完全限定的。也就是说,所述表名和/或列名包括给定元素上的层次顺序中的所有名称以及表和/或列本身的名称。每个完全限定的表名或列名在其数据库的架构中都是唯一的。此外,所述规范形式包含执行步骤的所有依赖逻辑步骤。所述规范形式是通过包括当前逻辑步骤所依赖的所有逻辑步骤来递归地生成的。所述规范形式为每种类型的操作定义关键字和语法结构。所述规范形式逻辑步骤中的词语(例如,表名)按字母顺序排序以提高其可重用性。这特别有用,因为许多SQL运算都具有可交换属性,即步骤可以按任何顺序执行。因此,即使某些词语的顺序与先前查询中使用的相应词语的顺序不同,系统也可以将逻辑步骤与规范形式进行匹配。尽管完全限定的表名被描述为按字母顺序排列,但表名可以按其它预定顺序排列,例如,首先按名称长度然后按字母顺序。可以使用任何预定顺序,只要该顺序适用于所述系统100处理的每个查询即可。

下面的材料描述了在执行步骤中使用的各种运算的规范形式。每个逻辑步骤都有一个规范形式,其遵循如下所述的定义语法。

SCAN运算具有以下规范形式:

SCAN(source[,PREDICATE(filter-expression)])

词语SCAN和PREDICATE是关键字,[]中的词语是可选的。“source”可以是基表(例如,数据库的列)或中间表(例如,执行查询中的先前操作所产生的表)。表名是完全限定的。

作为SCAN运算的规范形式的应用示例,SQL查询“SELECT*FROM t1WHERE c1>10”生成规范形式“SCAN(public.t1,PREDICATE(public.t1.c1>10))”,其中“public”是数据库名称,“t1”是数据库的特定列,“c1”是表示public.t1列中值的变量。

单个JOIN运算具有以下规范形式:

JOIN(source1,source2[,PREDICATE(join-condition)])

词语SCAN和PREDICATE是关键字,[]中的词语是可选的。JOIN运算可以是内联接(带联接条件)或笛卡尔积联接(不带联接条件)。项“source1”和“souce2”可以是基表或中间表。source1和souce2按照预定顺序排序,在一个示例实施例中,预定顺序是字母顺序。

作为JOIN运算的规范形式的应用示例,SQL查询“SELECT*FROM t1,t2WHERE t1.c1=t2.c1and t1.c1>10”生成规范形式“JOIN(SCAN(public.t1,PREDICATE(public.t1.c1>10)),SCAN(public.t2,PREDICATE(public.t2.c1>10)),PREDICATE(public.t1.c1=public.t2.c1))”。请注意,该规范形式包括具有来自SQL查询的谓词的规范形式的SCAN运算。

Multi-Way JOIN运算(也称为Consecutive JOIN运算)具有以下规范形式:

JOIN(source1,source2,source3,…[,PREDICATE(join-condition)])

可以扁平化Multi-Way JOIN运算(例如,可以单独指定源,而不考虑使用包含源的数据库结构)以提升Multi-Way JOIN规范形式的可重用性。具有排序的源名称的扁平联接规范形式允许在未来查询中重复使用基数数据,即使未来查询包含不同的联接顺序也可以重复使用基数数据。由于JOIN运算的可交换属性,Multi-Way JOIN运算可以实现扁平化(例如,(A join B)产生与(B join A)相同的结果)。因此,(A join B join C)与(B join Cjoin A)具有相同的规范形式。

作为Multi-Way JOIN运算的规范形式的应用示例,SQL查询“SELECT*FROMt1INNER JOIN t2ON t1.c1=t2.c1INNER JOIN t3ON t1.c1=t3.c1WHERE t1.c1>10”生成规范形式“JOIN(SCAN(public.t1,PREDICATE(public.t1.c1>10)),SCAN(public.t2,PREDICATE(public.t2.c1>10)),SCAN(public.t3,PREDICATE(public.t3.c1>10)),PREDICATE(public.t1.c1=public.t2.c1AND public.t1.c1=public.t3.c1))”。

Left Outer JOIN运算具有以下规范形式:

LEFTJOIN(source1,source2[,PREDICATE(join-condition)])

LEFTJOIN和PREDICATE是关键字。在Left Outer JOIN运算中,source1和source2的顺序无法更改,因为这两个源的顺序在Left Outer JOIN运算的语义中很重要。因此,Left Outer JOIN运算无法实现扁平化。Right Outer Join运算(RIGHTJOIN)的规范形式类似于Left Outer JOIN运算的规范形式。许多查询优化器将Right Outer JOIN运算转换为Left Outer JOIN运算。作为LEFTJOIN运算的示例,SQL查询“SELECT*FROM t2LEFT JOINt1ON t1.c1=t2.c1”生成规范形式“LEFTJOIN(SCAN(public.t2),SCAN(public.t1),PREDICATE(public.t1.c1=public.t2.c1))”。Other Join运算具有与Left Outer JOIN运算类似的规范形式。其中包括具有规范形式的Semi-join运算:

SEMIJOIN(source1,source2[,PREDICATE(join-condition)])

以及具有规范形式的Anti-join运算:

ANTIJOIN(source1,source2[,PREDICATE(join-condition)])

与Left Outer Join运算一样,SEMIJOIN和ANTIJOIN运算中source1和source2的顺序也不能更改,因为顺序在该运算的语义中很重要。

Full Outer JOIN运算具有以下规范形式:

FULLJOIN(source1,source2[,PREDICATE(join-condition)])

由于Full Outer JOIN运算具有可交换属性,因此可以将Full Outer JOIN运算中source1和source2的顺序改为预定顺序。

Aggregate Group By运算具有以下规范形式:

AGGREGATE(source,GROUPBY(columns)[,

PREDICATE(having-condition)])

在此规范形式中,词语AGGREGATE、GROUPBY和PREDICATE是关键字,“columns”是GROUP BY子句中指定的列的列表,PREDICATE包含HAVING子句中指定的条件。作为Aggregate Group By运算的示例,查询“SELECT customer_id,COUNT(order_id)FROMorders GROUP BY customer_id HAVING COUNT(order_id)>100”生成规范形式的运算“AGGREGATE(SCAN(public.orders),GROUPBY(public.orders.customer_id),PREDICATE(count(order_id)>100))”。

Union运算具有以下规范形式:

UNION(source1,source2,source3,…)

在此规范形式中,词语“UNION”是关键字,源可以是基表或中间表。所有源名称都按预定的字母顺序排序,因为UNION运算具有可交换属性。

Intersect运算具有以下规范形式:

INTERSECT(source1,source2,source3,…)

在此规范形式中,词语“INTERSECT”是关键字,源可以是基表或中间表。所有源名称都按预定的字母顺序排序,因为Intersect运算具有可交换属性。此外,可以对连续的INTERSECT运算进行组合、排序和扁平化处理,以提升可重用性。

上述运算并不是DBMS实施例中使用的所有运算。可以用类似的方式生成其它运算的规范形式。

例如,所述查询优化器110可以通过图4所示的计算设备400来实现。在一些实施例中,所述查询优化器110包括独立单元。或者,在其它实施例中,所述查询优化器110包括所述查询处理器104、所述数据库接口132、所述数据库目录140或所述执行引擎150中的一个或多个。

图2是一个示例实施例提供的查询处理方法的流程图。在操作202中,方法200接收SQL查询。在操作204中,方法200将所述查询解析为一个或多个具有规范形式逻辑步骤的执行计划,如上所述。在操作206中,方法200完全限定表名,并且针对具有可交换属性的运算,以预定顺序对表名重新排序。在操作208中,方法200为每个执行计划和每个执行计划的子集计算相应的哈希值,包括各个逻辑步骤的相应哈希值。然后操作210基于计算的哈希值在数据库目录中搜索基数值。在操作212中,方法200确定是否已经为解析的查询或其任何子部分找到基数,以及基数值是否具有当前时间戳。如果操作212确定已找到当前基数,则操作214传送具有所找到的基数值的解析查询,以及(可选地)传送用于查询的执行计划的哈希值和用于成本优化的所述查询的子部分。如果操作212确定未找到基数,或者找到的基数具有较旧的时间戳,则表示这些基数可能不可靠。操作216仅发送经解析的查询以进行成本优化。

图3是另一示例实施例提供的查询处理方法300的流程图。在一些实施例中,所述方法300包括递归查询处理方法。所述方法300执行执行计划的步骤。如上所述,执行计划采用树形式。树的根是整个查询,分支是树的子部分。树的叶是基本运算,例如上文描述的SCAN运算。所述方法300从操作302(处理执行计划中的根步骤)开始。在操作304中,所述方法300确定当前步骤是否是空步骤,这在前一步骤是没有子步骤的叶步骤时发生。如果当前步骤是叶步骤,则所述方法300在操作306处结束。如果操作304确定当前步骤不是空步骤,则所述方法300执行操作308以确定当前步骤是否是直通步骤。直通步骤是执行计划中不受基数影响的步骤。非直通步骤的示例包括但不限于SCAN、JOIN、AGGREGATE、UNION、INTERSECT、MINUS和LIMIT。这些步骤对正在处理的数据的基数和/或大小比较敏感。直通步骤的示例包括但不限于SORT、窗函数(例如SUM、COUNT、AVG)和REDISTRIBUTE。这些步骤对数据基数和/或大小不敏感。如果操作308确定当前步骤是直通步骤,则操作310将当前步骤设置为该直通步骤的子步骤并且分支回到操作302以处理新的当前步骤。

如果操作308确定当前步骤不是直通步骤,则所述方法300处理基数数据。在操作312中,所述方法300确定在操作302中执行步骤时确定的实际基数数据是否与估计基数不同。例如,估计基数可以包括在执行计划中,也可以从数据库目录中获取。当实际基数值和估计基数值之间没有差异时,方法300将控制权传递到操作318,如下所述,其为当前步骤的两个子树递归地调用所述方法300。

当操作312确定在操作302中确定的实际基数不同于存储在数据库目录中或通过查询执行计划接收的基数估计时,操作314生成当前步骤的规范形式和哈希值。操作314可以从执行计划生成这些值,也可以使用上述规则重新生成步骤的规范形式。类似地,可以通过执行计划接收哈希值,也可以从步骤的规范形式计算哈希值。在操作316中,步骤的实际基数和估计基数存储在数据库目录中,通过哈希值进行索引。

在操作316之后,或者在操作312之后,如果步骤的基数与估计的基数相同,则操作318为当前步骤的左子步骤和右子步骤调用所述方法300。这由从操作318到操作302的分支来指示。

作为上述方法的替代方法,操作318可以紧接在操作302之前发生,使得可以递归地调用该方法,直到遇到查询树的叶。该方法处理叶以生成中间结果,这些结果根据查询树的分支传送回要处理的方法的更高层级调用。此过程一直持续到使用逻辑步骤的子逻辑步骤生成的中间结果处理根节点处的逻辑步骤为止。

图4是一个示例实施例提供的用于执行查询处理的计算设备400的框图。在一些实施例中,所述计算设备400实现图1所示的查询处理器110。所有组件不需要均在各实施例中使用。例如,客户端、服务器和网络资源可以分别使用不同的组件集,或者如果是服务器,可以使用较大的存储设备。

所述计算设备400可以包括处理器402、存储器403、可移动存储器410和不可移动存储器412。在不同的实施例中,所述计算设备400可以采用不同的形式。例如,所述计算设备400可以是用于维护数据库的任何计算设备。此外,虽然各种数据存储元件被示为所述计算设备400的一部分,但是所述存储器410还可以或替代地包括可通过网络(未示出,例如因特网)访问的基于云的存储器,或基于服务器的存储器。

存储器403可以包括易失性存储器414和非易失性存储器408。所述计算设备400可以包括(或访问计算环境。该计算环境包括)各种计算机可读介质,如易失性存储器414和非易失性存储器408、可移动存储器410和不可移动存储器412。计算机存储器包括随机存取存储器(random access memory,RAM)、只读存储器(read only memory,ROM)、可擦除可编程只读存储器(erasable programmable read-only memory,EPROM)、电可擦除可编程只读存储器(electrically erasable programmable read-only memory,EEPROM)、闪存或其它存储器技术、只读光盘(compact disc read-only memory,CD ROM)、数字多功能光盘(digital versatile disk,DVD)或其它光盘存储器、盒式磁带、磁带、磁盘存储器或其它磁存储设备,或者任何其它能够存储计算机可读指令的介质。

所述计算设备400可以包括或可以访问包括输入接口406、输出接口404和通信接口416的计算环境。输出接口404可以提供到显示设备(例如触摸屏)的接口,该显示设备也可以用作输入设备。所述输入接口406可以提供以下形式的接口:触摸屏、触摸板、鼠标、键盘、相机、一个或多个设备专用按钮、集成在所述计算设备400和/或其它输入设备内或通过有线或无线数据连接耦合到所述计算设备400和/或其它输入设备的一个或多个传感器。所述计算设备400可以在使用通信接口416连接到一个或多个网络节点或远程计算机(例如数据库服务器)的联网环境中运行。所述远程计算机可以包括个人计算机(personalcomputer,PC)、服务器、路由器、网络PC、对等设备或其它公共网络节点等。例如,所述通信接口416可以包括到局域网(local area network,LAN)、广域网(wide area network,WAN)、蜂窝网络、Wi-Fi网络和/或

存储在计算机可读介质(例如一个或多个应用418)上的计算机可读指令可由所述计算设备400的所述处理器402执行。硬盘驱动器、CD-ROM、RAM和闪存是包括例如存储设备等非瞬时性计算机可读介质的部件的一些示例。术语“计算机可读介质”和“存储设备”不包括载波,在某种程度上,载波被认为过于短暂。

在一个实施例中,可以使用软件来实现本文描述的功能或算法。所述软件可以包含存储在计算机可读介质或计算机可读存储设备(例如一个或多个非瞬时性存储器或其它类型的基于硬件的本地或联网存储设备,例如在应用418中)上的计算机可执行指令。本文描述的实施例提供的一种设备可实现软件或计算机指令以执行查询处理,包括DBMS查询处理。此外,这些功能对应于模块,所述模块可以是软件、硬件、固件或其任意组合。可以根据需要在一个或多个模块中执行多种功能,所述实施例仅仅是示例。所述软件可以在数字信号处理器、ASIC、微处理器或在计算机系统(例如个人计算机、服务器或其它计算机系统)上运行的其它类型的处理器上执行,从而将这样的计算机系统变成编程专用机器。

在一些示例中,查询处理设备110或400包括:通信接口132或416,用于访问数据库130和数据库目录140;存储器403,用于存储指令418;以及处理器402,耦合至所述存储器403和所述通信接口132或416。所述处理器402执行以下指令418:解析查询以为所述查询生成第一和第二执行计划,所述第一和第二执行计划中的每一个都包括一个或多个逻辑步骤;从所述数据库目录140中检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值;从所述第一执行计划或所述第二执行计划中选择执行计划,基于所述先前确定的基数值,所述选定的执行计划具有较低的成本;通过所述通信接口132或416对从所述数据库访问的数据执行所述选定的执行计划。

在一些示例中,查询处理设备110或400包括:通信接口132或416,用于访问数据库130和数据库目录140;执行计划方法,用于解析查询并为所述查询生成第一和第二执行计划,所述第一和第二执行计划中的每一个都包括一个或多个逻辑步骤;基数方法,用于从所述数据库目录中检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值;选择方法,用于从所述第一执行计划或所述第二执行计划中选择执行计划,基于所述先前确定的基数值,所述选定的执行计划具有较低的成本;以及执行方法,通过所述数据库接口对从所述数据库访问的数据执行所述选定的执行计划。

在一些实施例中,所述查询处理设备110或400被实现为所述计算设备400。在一些实施例中,所述查询处理设备110或400被实现为数据库管理系统(database managementsystem,DBMS)查询处理设备。

在一个示例实施例中,所述计算设备400包括:查询解析器模块,用于解析查询以为所述查询生成第一和第二执行计划,所述第一和第二执行计划中的每一个都包括一个或多个逻辑步骤;基数检索模块,用于检索所述第一和第二执行计划的先前执行的逻辑步骤的相应先前确定的基数值;执行计划选择模块,用于从所述第一执行计划或所述第二执行计划中选择执行计划,基于所述先前确定的基数值,所述选定的执行计划具有较低的成本;以及计划执行模块,用于对数据库中的数据执行所述选定的执行计划。在一些实施例中,所述计算设备400可以包括其它或额外模块,用于执行实施例中描述的步骤中的任何一个或其组合。此外,如任何附图中所示或任何权利要求中所述的方法的任何额外或替代实施例或方面也预期可以包括类似的模块。

虽然上文详细描述了几个实施例,但是可能进行其它修改。例如,为了获得期望的结果,附图中描述的逻辑流程不需要遵照所示的特定顺序或者先后顺序。可以提供其它步骤或者从所描述的流程中去除步骤,所描述的系统中可以添加或移除其它组件。其它实施例可以在所附权利要求书的范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号