掌桥专利:专业的专利平台
掌桥专利
首页

用于分片的关系数据库组织

文献发布时间:2023-06-19 16:06:26



本申请是申请日为2016年9月30日、名称为“用于分片的关系数据库组织”、申请号为201680067124.9的发明专利申请的分案申请。

技术领域

本公开涉及数据库系统。更具体而言,本公开涉及用于分片(sharding)的关系数据库组织。

背景技术

存储越来越大量的数据的数据库系统变得越来越普遍。例如,诸如电子商务、移动、社交和软件即服务(SaaS)系统之类的在线事务处理(OLTP)系统通常需要大的数据库存储。OLTP系统的示例应用包括但不限于大型计费系统、票务系统、在线金融服务、媒体公司、在线信息服务和社交媒体公司。考虑到这些数据库系统存储的大量数据,将所有数据存储在单个数据库实例中是不实际的,因为该数据量可以利用大量计算资源,诸如处理器、存储器和存储装置。

此外,非关系数据库(有时称为NoSQL数据库)不提供关系数据库的完整特征的(fully featured)益处。例如,NoSQL数据库不提供关系数据库的相同模式控制、原子性、一致性、隔离性、持久性或完整特征的结构化查询语言(SQL)。

本节中描述的方法是可以被追寻的方法,但不一定是以前已经构想或追寻的方法。因此,除非另有说明,否则不应当假设本节中描述的方法中的任何方法仅仅因为被包含在本节中而成为现有技术。

发明内容

根据本公开的一个方面,提供了一种方法,包括:从表的集合中选择一个或多个列作为分区键;建立多个键值集,其中所述多个键值集中的每个键值集包括不属于其它键值集中的任何键值集的所述分区键的值;对于所述表的集合中的每个表,为所述多个键值集中的每个键值集生成分区;创建包括多个分片的分片数据库;其中所述多个分片中的每个分片与所述多个键值集中的不同键值集相关联;对于所述表的集合中的每个表,将所述表的分区分布在所述分片数据库的所述多个分片中;其中,对于每个表,与每个键值集相关联的分区被分布到所述多个分片中的与该键值集相关联的分片;以及存储映射数据,所述映射数据将所述多个键值集中的每个键值集映射到所述多个分片中的与该键值集相关联的分片。

根据本公开的又一个方面,提供了一种方法,包括:由分片协调器存储多个映射条目;其中所述多个映射条目中的每个映射条目将不同的分片键值集映射到分片数据库的多个分片中的分片;其中所述多个分片中的每个分片包括一个或多个数据库服务器;在所述分片协调器处从客户端应用接收第一查询,其中第一查询包括第一分片键值;响应于接收到第一查询,执行:识别所述多个映射条目中与包括第一分片键值的分片键值集对应的特定映射条目;使用所述特定映射条目来识别来自所述多个分片中的目标分片;通过使用与包括第一分片键值的分片键值集对应的所述目标分片来生成用于第一查询的第一结果;以及向所述客户端应用发送基于第一结果的对第一查询的响应。

根据本公开的又一个方面,提供了一种方法,包括:通过以下操作来执行涉及驻留在分片数据库的第一分片和第二分片两者中的数据的第一操作:使客户端应用向第一分片发送第一请求,以使第一分片执行第一操作的涉及第一分片中的数据的第一部分,以及使所述客户端应用向第二分片发送第二请求,以使第二分片执行第一操作的涉及第二分片中的数据的第二部分;通过以下操作来执行涉及驻留在分片数据库的第一分片和第二分片两者中的数据的第二操作:使所述客户端应用向分片协调器发送第三请求;以及响应于第三请求,所述分片协调器使:第一分片执行第二操作的涉及第一分片中的数据的第一部分,以及第二分片执行第二操作的涉及第二分片中的数据的第二部分。

根据本公开的又一个方面,提供了一种方法,包括:由分片目录维护指示由分片数据库的多个分片中的每个分片使用的模式的模式数据;接收用于修改模式的模式修改指令;响应于接收到所述模式修改指令,自动执行:在所述分片目录处基于所述模式修改指令来更新所述模式数据;以及通过针对所述多个分片中的每个特定分片执行以下操作,使所述多个分片中的所有分片修改模式:创建与特定分片的数据库连接;将所述模式修改指令发送到所述特定分片;以及在所述特定分片上执行所述模式修改指令。

根据本公开的又一个方面,提供了一种方法,包括:维护包括多个分片的分片数据库;其中所述多个分片被分组成多个分片空间;其中所述多个分片空间中的每个分片空间包括所述多个分片中的至少一个分片;使用一个或多个级别的分区标准,针对表执行一个或多个级别的分区,以产生第一多个分区;从用户接收用户指定的代码;至少部分地基于所述用户指定的代码为所述第一多个分区中的每个分区选择所述多个分片空间中的分片空间;以及基于所述用户指定的代码,将所述第一多个分区中的每个分区分布到为该分区选择的分片空间。

根据本公开的又一个方面,提供了一个或多个存储指令的非暂态计算机可读介质,所述指令在由一个或多个硬件处理器执行时使得执行本公开的方法。

根据本公开的又一个方面,提供了一种包括被配置为执行本公开的方法的一个或多个设备的装置。

附图说明

本发明的(一个或多个)示例实施例在附图的图中以示例而非限制的方式示出,在附图中相似的附图标记指代相似的元件,并且其中:

图1示出了根据一个实施例的未分片数据库和分片数据库的示例。

图2是根据一个实施例的用于分片数据库的系统的框图。

图3A和图3B示出了根据一个实施例的表家族(family)的示例。

图4A和图4B示出了根据一个实施例的重复的表的示例。

图5示出了根据一个实施例的作为分布式分区形式的分片的示例。

图6A和图6B示出了根据一个实施例的分片数据库中的块配置的示例。

图7示出了根据一个实施例的使用一致散列来将一定范围的值指派给块的示例。

图8示出了根据一个实施例的系统管理的分片的示例。

图9示出了根据一个实施例的分区到表空间和分片的映射的示例。

图10示出了根据一个实施例的使用复合分片的分片数据库的示例。

图11是根据一个实施例的子分区的分片数据库的示例。

图12A、图12B和图12C示出了根据一个实施例的重新分片的示例。

图13是根据一个实施例的用于重新分片的过程的流程图。

图14是根据一个实施例的用于基于代理的查询路由过程的流程图。

图15A和图15B是根据一个实施例的用于基于代理的查询路由过程的流程图。

图16是根据一个实施例的查询路由过程的流程图。

图17是其中可以体现本发明的(一个或多个)示例实施例的计算设备的框图。

图18是用于控制计算设备的操作的基本软件系统的框图。

具体实施方式

在下面的描述中,出于解释的目的,阐述了许多具体细节,以提供对本发明的(一个或多个)示例实施例的透彻理解。但是,将认识到的是,可以在没有这些具体细节的情况下实践(一个或多个)示例实施例。在其它实例中,公知的结构和设备以框图形式示出,以避免不必要地使(一个或多个)示例实施例模糊。

总体概述

水平分区是一种将单个较大的表分解为较小的、更易于管理的信息子集(称为“分区”)的技术。分片是一种数据层体系架构,在该数据层体系架构中数据跨独立的数据库实例被水平分区,其中每个独立的数据库实例被称为“分片”。分片的集合一起构成被称为“分片数据库(sharded database)”(“SDB”)的单个逻辑数据库。从逻辑上讲,分片数据库可以是客户端应用可访问的,就像传统的非分片数据库一样。但是,分片数据库中的表跨分片被水平分区。

图1示出了未分片数据库100和分片数据库110的示例。未分片数据库100是关系数据库并且包括表102。表102的所有内容都存储在同一未分片数据库100中,并且因此使用相同的计算资源,诸如处理器、存储器和盘空间。

但是,分片数据库110描绘了使用分片技术的替代配置。分片数据库110包括三个分片112、114和116。分片112、114和116中的每一个是其自己的数据库实例并且分别包括其自己的表113、115和117。但是,在分片数据库110中,表102已经跨分片112、114和116被水平分区为表113、115和117。分片数据库中的水平分区涉及跨分片拆分数据库表(诸如表102),使得每个分片包含表102的行的子集。在这个示例中,表113、115和117各自包含表102的行的子集。总的来说,表113、115和117可以被称为“分片表”。总体地存储在表113、115和117中的数据等价于存储在表102中的数据。分片数据库110在逻辑上被视为单个数据库,并且因此可以是客户端应用可访问的,就像非分片数据库100一样。

在一个实施例中,分片是什么都不共享的数据库体系架构,因为分片112、114和116不需要共享诸如处理器、存储器和/或盘存储设备之类的物理资源。分片112、114和116在软件方面松散耦合并且不需要运行集群件(clusterware)。从数据库管理员的角度来看,分片数据库110由可以被共同管理或者单独管理的多个数据库实例组成。但是,从客户端应用的角度来看,分片数据库110在逻辑上看起来像单个数据库。因此,分片数据库110中包括的分片的数量以及数据跨这些分片的分布对客户端应用来说是完全透明的。

分片数据库110的配置提供了各种益处。例如,在实施例中,分片数据库110通过添加附加分片以及跨分片分布负载从而消除性能瓶颈并且使得有可能增加系统的性能和容量来改善可扩展性。分片数据库110可以被实现为什么都不共享的体系架构,因此,分片数据库中的每个分片是其自己的数据库实例,并且分片不需要共享诸如处理器、存储器和/或盘存储装置之类的硬件。

在实施例中,分片数据库110提供故障遏制,因为它消除了诸如共享盘、共享存储区域网络、集群件、共享硬件等之类的单个故障点。相反,分片提供强故障隔离,因为单个分片的故障不影响其它分片的可用性。

在实施例中,分片数据库110提供对全局数据分布的增强。分片使得有可能将特定数据存储在与它的客户物理地接近的位置。当数据按照法律必须位于特定的司法辖区内时,可能有必要通过将用于该特定数据的分片物理地定位于该辖区内来将数据物理地靠近客户存储,以满足监管要求。在物理上靠近客户存储数据还可以通过改善客户与存储在分片中的底层数据之间的延迟来提供性能益处。

在实施例中,分片数据库110允许系统的滚动升级。在分片数据体系架构中,对一个分片进行的改变不影响分片数据库中其它分片的内容,由此允许数据库管理员首先尝试对存储在单个分片中的小数据子集的改变,然后将这些改变滚动到分片数据库中的其余分片。

在实施例中,分片数据库110提供云部署中的简单性。考虑到分片的尺寸可以做得任意小,数据库管理员容易在由具有本地存储装置的低端商品服务器组成的云中部署分片数据库。

在实施例中,分片数据库110在被良好分区、主要访问单个分片内的数据、并且不具有对于跨分片操作的严格性能和一致性要求的应用中最有效。因此,分片特别适用于OLTP系统,诸如电子商务、移动、社交和SaaS。

在实施例中,分片数据库110提供对数据库模式改变跨分片的自动传播的改进。作为需要数据库管理员手动将数据库模式改变应用于每个单独的分片的替代,分片数据库110可以从单个入口点将这种模式改变自动地传播到分片。

在实施例中,分片数据库110支持传统的结构化查询语言(SQL),因此可以利用已经可用的所有完整的SQL语法和关键字。此外,考虑到分片数据库110支持SQL,它可以容易地与被配置为经由SQL访问关系数据库的现有客户端应用集成。

在实施例中,分片数据库110提供关系数据库的完整特征的优点,包括模式控制、原子性、一致性、隔离性和持久性。

在一些实施例中,分片数据库110提供将查询直接路由到分片,而不需要中间部件来路由查询。这种直接路由通过减少处理查询所需的网络跳数来改善系统延迟。

一般体系架构

图2是根据一个实施例的数据库系统的框图。客户端应用210是需要访问存储在数据库中的数据的任何类型的客户端应用。在一个实施例中,客户端应用210可以是OLTP设置(诸如电子商务、移动、社交或SaaS)中的客户端。客户端应用210可通信地耦合到分片数据库250。

分片数据库250是逻辑数据库,在该逻辑数据库中数据跨独立的数据库实例被水平分区。具体而言,存储在分片数据库250中的数据被水平分区并且被存储在分片260A、260B和260C中。分片数据库可以包括任何数量的分片,并且分片数据库中的分片的数量可以随时间而变化。根据一个实施例,分片260A、260B和260C中的每一个是其自己的数据库实例,其需要与分片数据库250中的其它分片共享物理资源,诸如处理器、存储器和/或存储设备。

分片目录

分片数据库250包括分片目录230。分片目录230是用于存储分片数据库250的配置数据的特殊数据库。在一个实施例中,可以复制分片目录,以提供改进的可用性和可伸缩性。存储在分片目录230中的配置数据可以包括:路由表,该路由表映射哪个分片存储与分片键的给定的值、值范围或值集合对应的数据块;分片拓扑数据,该分片拓扑数据描述分片数据库250的整体配置,关于分片260A、260B和260C的配置的信息;关于分片导向器(director)220的配置的信息,关于客户端应用210的信息,关于跨分片260A、260B和260C被水平分区的数据的模式的信息,用于分片260A、260B和260C的未决的和已完成的模式修改指令的历史日志,以及与分片数据库250的配置相关的所有其它信息。

在一个实施例中,分片目录维护存储包括多个映射条目的映射数据的路由表。多个映射条目中的每个映射条目将一个或多个分片键的不同键值集映射到分片数据库中的多个分片中的分片。在另一个实施例中,多个映射条目中的每个映射条目将一个或多个分片键的不同的键值集映射到分片数据库中的多个分片中的分片上的数据块。在另一个实施例中,多个映射条目中的每个映射条目将一个或多个分片键的不同的键值集映射到包括分片数据库中的一个或多个分片的分片空间。在一个实施例中,键值集可以是一系列分区键值。在另一个实施例中,键值集可以是分区键值的列表。在另一个实施例中,键值集可以是散列值的集合。

因此,对于需要访问特定分片键值的数据的查询,可以使用路由表来查找分片数据库中的哪个分片包含处理查询所需的数据块。

分片导向器

分片数据库260包括分片导向器220。分片导向器220协调跨分片数据库250的各种功能,包括但不限于:将数据库请求路由到分片、将数据库模式改变传播到分片、监视分片的状态、从分片接收状态更新、从客户端应用接收通知、向分片发送通知、向客户端应用发送通知、和/或协调影响分片数据库260的配置的各种操作,诸如重新分片操作。分片导向器220可通信地耦合到分片目录230、客户端应用210以及分片260A、260B和260C。

虽然被描绘为单个分片导向器220,但是在一个实施例中,分片数据库260可以包括多个分片导向器220。例如,在一个实施例中,分片数据库260可以包括三个分片导向器220。具有多个分片导向器220可以允许对由分片导向器220执行的协调任务进行负载均衡,由此改进性能。在多个分片导向器220的情况下,在一个实施例中,分片导向器220中的一个可以被选择为分片导向器220的管理器,其负责管理其余分片导向器220,包括负载均衡。

表家族

为了获得分片的益处,分片数据库的模式应当以最大化可以在单个分片上执行而不需要多个分片的数据请求的数量的方式来设计。通过在单个分片上执行查询,不需要跨分片联接(join),由此提高效率。

数据库表之间常常存在父子关系。例如,父表和子表之间可以存在引用约束。具体而言,在外键约束的情况下,子表的列可以被约束为只存储父表的主键中存在的值。通过这种关系链接的多个表通常形成其中每个孩子都有单个父亲的树状层次结构。“表家族”是相关表的层次结构的表示。表家族中没有父亲的表被称为“根表”。表家族中只有一个根表。

例如,图3A示出了表家族310的示例。表家族310包括表312、314和316。表312、314和316示出了经典的客户(Customers)/订单(Order)/行条目(LineItems)模式。表312是包括客户信息的表。客户表312的主键是“客户编号(CustNo)”字段。客户表312是表家族310的根表。

订单(Orders)表314是包括订单信息的表。订单表314的主键是“订单编号(OrderNo)”字段。订单表314的外键是引用客户表312的主键的“客户编号”字段,这指示订单表314的“客户编号”字段仅被允许存储存在于客户表312的“客户编号”字段中的值。因此,订单表314是客户表312的孩子。

行条目表316是包括行条目信息的表。行条目表316的主键是“行编号”字段。行编号表316的外键是引用订单表314的主键的“订单编号”字段,这指示表316的“订单编号”字段仅被允许存储存在于订单表314的“订单编号”字段中的值。因此,行条目表316是订单表314的孩子。

根据一个实施例,当对属于表家族的表进行分片时,通过从表家族的根表继承分区键来对表家族的所有表进行分区。因此,根表的分区键被用作表家族中所有表的分区键。在一个实施例中,分区键相当于分片数据库中的分片键。在表家族310的示例中,“客户编号”字段可以用作表家族310中所有表的分区键和分片键。来自表家族的所有表的对应分区总是被存储在相同的分片中。由于在分片数据库中联接操作通常对来自表家族中的表的相关数据执行,因此将来自表家族的对应分区存储在相同的分片中可以改进这种联接的执行,因为可以对单个分片执行联接操作并且不需要跨分片查询。

为了说明,图3B示出了来自表家族310的数据可以如何被分片为三个分片320、330和340的示例。分片320包括已经基于“客户编号”分片键被分区的表322、324和326。具体而言,表322、324和326各自包含用于客户表、订单表和行条目表的对应数据,其中客户编号=123。分片330包括表332、334和336。分片340包括同样已经基于“客户编号”分片键被分区的表342、344和346。具体而言,表332、334和336各自包含来自客户表、订单表和行条目表的对应数据,其中客户编号=456。具体而言,表342、344和346各自包含来自客户表、订单表和行条目表的对应数据,其中客户编号=999。

总体上,表322、332和342是客户表312的分片表(sharded table)表示,但是,现在内容分散在三个分片上。类似地,表324、334和344集体地包含与订单表314相同的数据,但是,现在内容分散在三个分片上。此外,表326、336和346集体地包含与行条目表316相同的数据,但是,现在内容分散在三个分片上。通过对于所有表312、314和316使用相同分片键对表家族310的内容进行分片,每个分片将能够单独执行对于给定表家族的相关数据的联接,由此改进系统性能并减少跨分片查询的频率。

表1给出了用于为客户表、订单表和行条目表创建分片表的示例性代码:

CREATE SHARDED TABLE Customers

(CustNo NUMBER NOT NULL,Name VARCHAR2(50),Address VARCHAR2(250),CONSTRAINT RootPK PRIMARY KEY(CustNo))

PARTITION BY CONSISTENT HASH(CustNo)

PARTITIONS AUTO

TABLESPACE SET ts1

CREATE SHARDED TABLE Orders

(OrderNo NUMBER NOT NULL,CustNo NUMBER NOT NULL,OrderDate DATE,CONSTRAINT OrderPK PRIMARY KEY(OrderNo),CONSTRAINT CustFK FOREIGN KEY(CustNo)REFERENCES Customers(CustNo))

PARTITION BY REFERENCE(CustFK)

CREATE SHARDED TABLE LineItems

(CustNo NUMBER NOT NULL,LineNo NUMBER(2)NOT NULL,OrderNo NUMBER(5)NOTNULL

,StockNo NUMBER(4)

,Quantity NUMBER(2)

,CONSTRAINT LinePK PRIMARY KEY(CustNo,OrderNo,LineNo)

,CONSTRAINT LineFK FOREIGN KEY(CustNo,OrderNo)REFERENCES Orders(CustNo,OrderNo)

)

PARTITION BY REFERENCE(LineFK)

在上面的语法示例中,通过使用CustNo(客户编号)字段作为分区键,将Customers(客户)表跨分片进行分区。Customers表是表家族中的根表。Orders(订单)表和LineItems(行条目)表分别是Customers表的孩子和孙子表。Orders表和LineItems表按照对间接指向回Customers表的分区键的外键的引用进行分区。因此,Orders表和LineItems表也是基于Customers表的相同分区键进行分区的。因此,Customers表、Orders表和LineItems表是表家族,它们针对相同的分区键跨分片被相似地分区。

在另一个实施例中,即使表的模式没有显式地表现(articulate)定义表集合的表之间的父-子关系的约束(诸如外键),表集合也跨分片进行分区,就像它们是表家族一样。在这种情况下,数据库管理员可以认识到这些表彼此相关,即使它们不是显式的“表家族”。数据库管理员可以识别一个或多个分区键,以用于跨分片对表的集合进行分区,以使得表的集合的分区包括将可能用于满足单个查询的相关数据,并且跨表的集合的这种分区将被包括在同一个分片上。因此,即使在没有基于模式中的约束形成显式的表家族时,数据库管理员也可以实质上模拟表的集合的逻辑分组。例如,在一个实施例中,表的集合包括客户表和订单表。客户表和订单表可以各自包括“客户编号”列,但是,模式中不存在将客户表链接到订单表的引用约束。在这个示例中,即使没有形成正式的表家族,数据库管理员也可以使用客户编号字段作为至少一个分区键来对表的集合进行分区。因此,可以使用表的集合的逻辑分组来创建数据块,如将在后面描述的。

重复的表

一些参考表相对小、不经常改变、和/或常常与分片表一起被访问。参考表的示例可以是美国的邮政编码表。这种邮政编码信息相对小并且是静态的,但可能经常与涉及地址的其它分片表一起被访问。参考表是被实现为跨分片数据库中的所有分片被复制的“重复的表(duplicated table)”的良好候选项。通过将重复的表的拷贝存储在多个分片上,系统可以确保更多的查询能够经由单个分片被处理,而不需要跨分片查询,由此提高系统效率。

图4A示出了未分片数据库410的示例。未分片数据库410包括客户表412、订单表414和行条目表416,它们再次形成表家族。未分片数据库410还包括产品(Products)表418,其是参考表的示例。

图4B示出了包括分片420、430和440的分片数据库的示例。表412、414和416的分片与图3B中所做的类似。具体而言,分片420包括表422、424和426。分片430包括表432、434和436。分片440包括表442、444和446。但是,此外,分片420、430和440中的每一个分别包括重复的表418。以这种方式,分片420、430、440中的每一个可以访问表418的内容,由此最小化执行跨分片查询以访问参考表的内容的需要。

表2给出了用于创建重复的表的示例性代码:

CREATE DUPLICATED TABLE Products(SKU NUMBER PRIMARY KEY,ProductVARCHAR2(20),);

在一个实施例中,使用物化视图复制来同步每个分片上的重复的表。在一个实施例中,每个分片上的重复的表是只读的物化视图。物化视图的主表位于分片目录中。在一个实施例中,所有分片上的物化视图以可配置的频率自动刷新。在一个实施例中,CREATEDUPLICATED TABLE命令自动创建主表、物化视图和物化视图复制所需的其它对象。

作为分布式分区的分片

尽管从数据库管理员的角度来看,分片数据库对于客户端应用和客户端应用开发人员看起来像单个数据库,但是它是分片的集合,其中每个分片都是离散的数据库实例。分片表跨分片数据库的所有分片被分区。因此,分片数据库的每个分片上的表分区与非分片数据库中使用的常规分区没有区别。

图5示出了作为分布式分区的分片的示例。未分片数据库500包括被分解成分区1-20的单个表。分片数据库520具有作为分区跨分片521、522、523、524和525分布的这些同样的分区1-20。从客户端应用的角度来看,分区的结构和格式是相同的,但是,在分片数据库520的情况下,分区跨五个不同的分片分布,因此,计算负载跨每个分片的计算资源分布。

表空间和块

“表空间”是用于存储数据库中的数据库对象的数据的存储容器(例如,数据文件)的集合。数据库对象是由数据库系统管理的对象。数据库对象的示例包括可以由数据库系统执行的表、索引和代码模块。当表空间保持数据库对象的数据时,数据库对象可以被称为在特定的表空间中。分片表的每个分区都被存储在分开的表空间中。因此,表空间是分片数据库中数据分布的物理单位。“表空间集”是表空间的集合。

有可能在不同表空间集中从表集合或表家族创建不同的表。例如,可以在表空间集TS1中创建客户表,并且可以在表空间集TS2中创建订单表。但是,为了最小化所需的跨分片查询的数量,必须保证存储客户表的partition_1的表空间与存储订单表的对应partition_1的表空间始终驻留在同一分片中。为了实现这个目标,“块(chunk)”可以被定义为存储表的对应分区的数据集。例如,在一个实施例中,块可以被定义为存储表家族中的所有表的对应分区的表空间集。块包含来自相关表集合或表家族的每个表的单个分区。

图6A示出了根据一个实施例的块601的示例。块601存储客户表、订单表和行条目表的对应分区。具体而言,块601基于分区键的值的范围存储覆盖客户表中的客户1至1000000(1M)的分区Customers_P1。块601还使用相同的分区键存储包括用于Customers_P1中的客户的在订单表中的对应行的分区Orders_P1。块601还针对相同分区键存储包括用于Orders_P1中的订单的行条目表中的对应行的分区LineItems_P1。因此,分区Customers_P1、Orders_P1和LineItems_P1都基于相同的分区键被分区。因此,需要落入分区键的值集合内的客户的来自客户表、订单表和行条目表的数据的联接操作可以由包含块601的单个分片来服务,而无需跨分片查询。

图6B示出了分片620的示例。分片620包括块601、606和611,块601、606和611包括来自包括客户表、订单表和行条目表的表家族的分区。基于分区键的值的不同范围,块601、606和611中的每一个都包含来自表家族的每个表的单个分区。在这个示例中,分区键是客户表的客户编号列。例如,块601包括对于在1到1000000范围内的客户编号的来自客户表、订单表和行条目表的数据。块606覆盖对于在5000001到6000000范围内的客户编号的来自客户表、订单表和行条目表的数据。块611包括对于在10000001到11000000范围内的客户编号的来自客户表、订单表和行条目表的数据。分片620还包括表630,表630是作为参考表的产品表的重复拷贝。因此,需要来自共享相同分区键值的Customers、Orders或LineItems的对应行的数据的查询可以由包含用于这三个表的分区的块的单个分片来服务。这种查询不需要跨分片联接。

系统管理的分片

在一个实施例中,系统管理的分片是用于分片的技术,在该技术中系统自动确定数据到分片数据库中的分片的映射。如本文将描述的那样,使用通过散列策略的分区,数据自动跨分片分布。因此,系统管理的分片将数据跨分片均匀且随机地分布。因为数据跨分片随机且均匀地分布,所以系统管理的分片降低了创建如下块的可能性,所述块是需要处理相对于分片数据库中的其它块而言比例不符的量的数据请求的热点。此外,因为数据跨分片随机且均匀地分布,所以系统管理的分片提供跨分片统一的性能。在一个实施例中,使用系统管理的分片的分片数据库可以维持在从分片数据库添加或移除分片时数据的均衡分布。

在一个实施例中,在系统管理的分片中,基于应用于分片键的散列函数来将数据分配给分片。例如,在一个实施例中,传统的散列是可以在系统管理的分片中使用的分区策略。在传统的散列中,散列函数如下应用于分片键,以确定要将数据指派到的块:hash(键)%N。在这里,hash()是散列函数,并且N是表示块的数量的常数。因此,通过将传统散列应用于分片键,系统可以确定将与分片键相关联的数据指派到哪个块。

在一个实施例中,一致散列是可以在系统管理的分片中使用的分区策略。在一致散列中,将散列函数应用于分片键,以获得散列值。散列函数的值的可能范围(例如,从0到2

例如,图7示出了指派给块的值范围的示例。在这个示例中,分片数据库包含1024个块,并且每个块被指派2

假设所有分片具有相同的计算能力,那么将相同数量的块指派给分片数据库中的每个分片。例如,如果在包含16个分片的分片数据库中创建1024个块,那么每个分片将包含64个块。在一个实施例中,块被随机分配给分片,以提供数据跨分片的随机且均匀的分布。

在重新分片的情况下,当将分片添加到分片数据库或从分片数据库中移除分片时,一定数量的块在分片之间移动,以维持块跨分片的均匀分布。在这个重新分片处理期间,块的内容不改变,因此,不需要重新散列。

具有系统管理的分片的分片数据库中的块的数量可以在CREATE SHARDCATALOG命令中指定。一旦部署了分片数据库,就只能通过拆分块来改变块的数量。当块被拆分时,其散列值的范围被分成两个范围,但是对于其余的块不需要做任何事情。任何块可以在任何时候被独立地拆分。

块可以只包含来自给定表空间集的一个表空间。但是,相同的表空间集可以用于属于同一个表家族的多个表。在这种情况下,表空间集中的每个表空间将存储多个分区,每个表一个分区。可替代地,表家族中的每个表可以存储在分开的表空间集中。在这种情况下,块包含多个表空间:每个表一个表空间,并且每个表空间存储单个分区。

图8示出了系统管理的分片的示例,其示出了具有单个分片表的简单情况的分区、表空间和分片之间的关系。在这种情况下,每个块包含单个表空间,并且每个表空间存储单个分区。分片数据库包括分片820、830、840和850。分区P_1至P_480位于表空间tbs1-1至tbs1-480中。表空间集810包括表空间tbs1-1至tbs1-480。

表3给出了使用系统管理的分片创建分片表的示例性代码:

CREATE SHARDED TABLE customers

(cust_id NUMBER NOT NULL,name VARCHAR2(50),address VARCHAR2(250),location_id VARCHAR2(20),class VARCHAR2(3),signup DATE,CONSTRAINT cust_pkPRIMARY KEY(cust_id))

PARTITION BY CONSISTENT HASH(cust_id)

PARTITIONS AUTO

TABLESPACE SET ts1

在这个示例中,创建了分片表“customers”,其使用跨cust_id分片键的一致散列。语句包含“PARTITIONS AUTO”,这指示分区的数量将自动设置为表空间集ts1中的表空间的数量。因此,块的数量也将等于表空间集ts1中的表空间的数量。

用户定义的分片

在一个实施例中,用户定义的分片是用于分片的技术,该技术允许诸如数据库管理员之类的用户显式指定数据到分片的用户定义的映射。当需要将某些数据存储在特定分片上并且数据库管理员需要对在分片之间移动数据的全面控制时,可以使用用户定义的分片。例如,当性能约束要求某些数据位于特定分片上时,用户定义的分片可以是有益的。在另一个示例中,当监管要求需要特定数据被存储在特定分片上时,用户定义的分片可以是必要的。用户定义的分片的另一个益处是,在分片的计划内或计划外中断的情况下,数据库管理员确切知道由于中断而导致哪些数据不可用。用户定义的分片的缺点是数据库管理员需要监视分片并手动维护跨分片的数据和工作负载的均衡分布。

通过用户定义的分片,分片表可以按范围或列表分区。除了每个分区应当存储在分开的表空间中的附加要求之外,用于分片表的CREATE TABLE语法与用于创建常规表的语法相似。表4给出了使用用于accounts表的用户定义的分片来创建表的示例性代码:

CREATE SHARDED TABLE accounts

(id NUMBER,account_number NUMBER,customer_id NUMBER,branch_id NUMBER,state VARCHAR(2),status VARCHAR2(1))

PARTITION BY LIST(state)

(PARTITION p_northwest VALUES('OR','WA')TABLESPACE tbs1

,PARTITION p_southwest VALUES('AZ','UT','NM')TABLESPACE tbs2

,PARTITION p_northcentral VALUES('SD','WI')TABLESPACE tbs3

,PARTITION p_southcentral VALUES('OK','TX')TABLESPACE tbs4

,PARTITION p_northeast VALUES('NY','VR','NJ')TABLESPACE tbs5

,PARTITION p_southeast VALUES('FL','GA')TABLESPACE tbs6

)

在表4中所示的示例中,accounts(账户)表被创建为分片表,并使用state(州)作为分区键按照列表被分区。用户正在定义基于分区键将哪些分区指派给特定的表空间。没有为用户定义的分片设置的表空间。每个表空间必须被显式地创建。“分片空间”是存储与键值的范围或列表对应的数据的分片集合。具体而言,在用户定义的分片的情况下,分片空间由分片或完全复制的分片的集合组成。表5给出了用于为accounts表创建表空间的示例性代码:

CREATE TABLESPACE tbs1 IN SHARDSPACE west;

CREATE TABLESPACE tbs2 IN SHARDSPACE west;

CREATE TABLESPACE tbs3 IN SHARDSPACE central;

CREATE TABLESPACE tbs4 IN SHARDSPACE central;

CREATE TABLESPACE tbs5 IN SHARDSPACE east;

CREATE TABLESPACE tbs6 IN SHARDSPACE east;

因此,在上面表5所示的示例中,用户手动定义每个表空间在分片空间中的位置。表6给出了用于为accounts表创建分片空间和填充分片的示例性代码:

ADD SHARDSPACE–SHARDSPACE west,central,east;

ADD SHARD–CONNECT shard-1–SHARDSPACE west;

ADD SHARD–CONNECT shard-2–SHARDSPACE central;

ADD SHARD–CONNECT shard-3–SHARDSPACE east;

因此,在上面表6所示的示例中,用户手动定义什么分片空间填充每个分片。

图9示出了将分区映射到表空间和将表空间映射到accounts表的分片的示例。accounts表跨分片920、930和940被分片。分片920与西分片空间相关联,分片930与中分片空间相关联,并且分片940与东分片空间相关联。

在一个实施例中,用户定义的分片可以被用于基于性能或其它约束将数据分离(segregate)到具体的分片上。例如,在一个实施例中,通过使用用户定义的分片,可以将第一数据集分配给云环境可访问的第一分片集合,并且可以将第二数据集分配给云环境无法访问的第二分片集合。由于要求经由云环境无法访问数据的隐私或监管问题,分离数据可能是有帮助的。在其它实施例中,分离数据可以有助于归档目的,因为被归档的数据被分离到具有较低性能能力的分片上,而正被活跃使用的数据被分离到具有较高性能能力的分片上。

复合分片

在一个实施例中,复合分片是用于将用户定义的分片的特征与系统管理的分片的特征组合的分片的算法。

系统管理的分片跨分片随机分布数据,与使用按照范围或列表进行分区的用户定义的分片相比,这提供了更好的负载均衡。但是,系统管理的分片并不给予数据库管理员对数据向分片的指派的任何控制。

用户定义的分片提供了将特定数据分配给特定分片的能力,这对于满足各种要求可以是必需的。例如,监管要求可以要求将某些数据存储在位于特定地理位置的计算机硬件中。同样,分片可以在具有不同硬件性能特点的不同计算设备上实现,这些计算设备包括但不限于处理器、存储器和存储装置。此外,可以基于数据的分类来区分数据,其中数据的分类是基于表中的特定列确定的。例如,在客户相关数据的情况下,一些客户可以被分类为“GOLD(黄金)”客户,而其它客户可以被分类为“SILVER(白银)”。在这个示例中,GOLD客户的数据可以需要被存储在一个分片集中,而SILVER客户的数据可以需要被存储在不同的分片集中。

通过复合分片,可以将数据跨多于一个级别的分区进行分区。例如,数据可以首先跨多个分片空间按照列表或范围进行分区,然后跨每个分片空间中的多个分片通过一致散列被进一步分区。给定用户定义的映射数据,由复合分片提供的多级分片允许系统跨每个分片空间中的分片自动维护数据的均衡分布,同时跨分片空间对数据进行分区。可以使用数据定义语言(DDL)执行复合分片。

例如,假设数据库管理员希望将较快的服务器上托管的三个分片分配给GOLD客户,并将在较慢的机器上托管的四个分片分配给SILVER客户。在每个分片集内,必须使用通过对于customer_id的一致散列进行的分区来分布客户。因此,在这个示例中,数据使用指示客户类别的第一分片键通过范围或列表跨分片空间被分区。数据进一步使用用于customer_id的第二分片键通过一致散列跨分片空间内的分片被分区。在一个实施例中,第一分片键可以被称为超级分片键。超级分片键是被用于复合分片配置中的较高级别的分区的一种类型的分片键。在一个实施例中,路由表存储映射数据,该映射数据针对第一分片键的值集合和第二分片键的值集合的组合映射到包含特定分片空间中特定分片中的数据的块的位置。因此,路由表可以被用于使用第一分片键和第二分片键的组合来确定特定分片空间中特定分片上的包含用于给定键组合的数据的块的位置。

图10示出了包括分片空间1001和分片空间1002的分片数据库1000的示例。分片空间1001是专用于GOLD客户的分片空间,并且包括覆盖表空间集1010的分片1020、1030和1040。分片空间1002是专用于SILVER客户的分片空间,并且包括覆盖表空间集1011的分片1050、1060、1070和1080。

表7给出了用于创建分片空间1001和1002的示例性代码:

ADD SHARDSPACE–SHARDSPACE shspace1,shspace2;

ADD SHARD–CONNECT shard1–SHARDSPACE shspace1;

ADD SHARD–CONNECT shard2–SHARDSPACE shspace1;

ADD SHARD–CONNECT shard3–SHARDSPACE shspace1;

ADD SHARD–CONNECT shard4–SHARDSPACE shspace2;

ADD SHARD–CONNECT shard5–SHARDSPACE shspace2;

ADD SHARD–CONNECT shard6–SHARDSPACE shspace2;

ADD SHARD–CONNECT shard7–SHARDSPACE shspace2;

在上面的表7中,用户提供了多个分片(shard1、shard 2、shard3、shard4、shard5、shard6和shard7)到多个分片空间(shspace1和shspace2)的映射。表8给出了用于创建表空间集1010和1011的示例性代码:

CREATE TABLESPACE SET tbs1 IN SHARDSPACE shspace1;

CREATE TABLESPACE SET tbs2 IN SHARDSPACE shspace2;

在上面的表8的示例中,用户提供了表空间集(tbs1和tbs2)到分片空间(shspace1和shspace2)的映射。一旦创建了分片空间和表空间集,就可以创建分片表,基于服务类别将分片表分区成两个分区集:GOLD和SILVER。表9给出了用于为分片数据库1000创建分片表的示例性代码:

CREATE SHARDED TABLE customers

(cust_id NUMBER NOT NULL,name VARCHAR2(50),address VARCHAR2(250),location_id VARCHAR2(20),class VARCHAR2(3),signup_date DATE,CONSTRAINT cust_pk PRIMARY KEY(cust_id))

PARTITIONSET BY LIST(class)

PARTITION BY CONSISTENT HASH(cust_id)

PARTITIONS AUTO

(PARTITIONSET gold VALUES(‘gld’)TABLESPACE SET tbs1,PARTITIONSETsilver VALUES(‘slv’)TABLESPACE SET tbs2);

在上面的表9的示例中,客户表被创建为分片表。客户表首先使用“class”列作为分区键被分区。在表9中,由用户提供的映射将GOLD客户映射到表空间集tbs1并将SILVER客户映射到表空间集tbs2。这是用户定义的分片的示例。客户表使用“cust_id”作为分区键被进一步分区。该进一步的分区使用一致散列,并且是系统管理的分片的示例。因此,表9的最终结果是组合用户定义的分片的特征和系统管理的分片的特征的复合分片。

复合分片提供了用户定义的分片的益处,因为它允许用户基于用户定义的约束来定制数据向分片空间的分配。这种用户定义的约束可以基于应用而变化,并且可以包括约束,诸如对数据的物理位置的监管限制、基于数据类别的区分或者数据在不同硬件资源上的分配。通过提供数据在同一分片空间内的分片内的自动和随机化分布,复合分片同样提供了系统管理的分片的益处。因此,复合分片是一种组合用户定义的分片和系统管理的分片的益处的多级分片方法。

在一个实施例中,多级复合分片是用于在分片数据库中分布数据的策略,该分片数据库可以包括任何数量的N级分区,并且不限于两级分区。例如,在一个实施例中,前N-1级各自基于范围或列表被分区,并且可以各自使用不同的分区键被分区。此外,在一个实施例中,第N级基于诸如一致散列函数之类的散列函数被分区。因此,这种多级复合分片可以被用于模拟数据跨一个或多个分片空间、表空间集和/或分片的多级分层组织。这种多级复合分片策略提供了用户定义的分片的益处和系统管理的分片的益处。

在一个实施例中,当使用复合分片时,存在用于每个级别的分片的分片键。可以将多个分片键值存储在键值集中,以便维持映射数据,从而允许驻留在多级复合分片数据库中的分片上的特定数据片段的定位。在一个实施例中,为了确定哪个分片包含用于特定数据库请求的数据,客户端应用将需要在数据库请求内包括所有分片键的值。

子分区

在一个实施例中,子分区技术可以与分片技术组合,以允许包括在分片中的分区进一步被子分区。子分区将每个分区拆分成更小的部分。子分区提供了各种益处。例如,子分区允许跨分片对数据的多级组织。例如,在分片内,数据可以基于日期、客户类别或来自数据的某个其它标准被组织成子分区。子分区对于分片内的高效并行执行是有益的,尤其是在每个分片的分区数量可能较小时按照范围或列表进行分片的情况下。被子分区的数据可以按照列表、范围或散列函数(诸如一致散列或传统散列)被分区。

表10给出了通过一致散列进行系统定义的分片并且按照范围进行子分区的示例性代码:

CREATE SHARDED TABLE customers

(cust_id NUMBER NOT NULL,name VARCHAR2(50),address VARCHAR2(250),location_id VARCHAR2(20),class VARCHAR2(3),signup_date DATE,CONSTRAINT cust_pk PRIMARY KEY(cust_id,signup_date))

TABLESPACE SET tbs1

PARTITION BY CONSISTENT HASH(cust_id)

SUBPARTITION BY RANGE(signup_date)

SUBPARTITION TEMPLATE

(SUBPARTITION per1 VALUES LESS THAN(TO_DATE('01/01/2000','DD/MM/YYYY'))

,SUBPARTITION per2 VALUES LESS THAN(TO_DATE('01/01/2010','DD/MM/YYYY'))

,SUBPARTITION per3 VALUES LESS THAN(TO_DATE('01/01/2020','DD/MM/YYYY'))

,SUBPARTITION future VALUES LESS THAN(MAXVALUE))

)

PARTITIONS AUTO

在这个示例中,创建了Customers分片表。Customers分片表首先使用cust_id通过一致散列被分区,然后通过signup_date被子分区为四个子分区。图11示出了应用这个代码的结果的示例。分区都在表空间集tbs1 1110中创建。分区跨分片1120、1130和1140通过一致散列被分区。这些分区中的每个分区都在其自己的表空间中。此外,每个分区包括四个子分区,这四个子分区通过signup_date被分区并存储在父亲的表空间中。

子分区可以与系统管理的分片、用户定义的分片或复合分片组合。如果将子分区与复合分片组合,那么表中的数据最终将组织成三个级别:分区集、分区和子分区。每个级别的分区的分区键可以不同,并且可以更新路由表以包括用于所有三个分区键的映射数据。

用于子分区的示例应用区域可以是存储关于符合监管要求和归档要求的客户表的数据。监管要求可以要求关于特定客户的数据被存储在物理上位于客户的地理辖区内的分片中。归档要求可以要求将较旧客户的数据与较新客户的数据分开存储。例如,关于较旧客户的数据可以需要分开存储以便被归档到备份存储装置。可以使用用户定义的分片来存储分片表的创建分区以使得每个分片包含地理上位于与分片相同的辖区本地的客户的数据以及子分区以创建基于服务的注册日期来对客户分组的子分区来满足这些要求。因此,子分区允许在分片数据库中对数据进行多级组织。

复制

由于分片数据库中的分片中的每个分片都是其自己的数据库实例,因此本系统可以使用现有的复制技术来复制存储在分片中的数据。例如,在主动/主动复制中,两个对等的数据库实例可以存储可以由客户端应用改变和访问的相同的数据集。对于对等数据库实例中的一个对等数据库实例所做的改变被复制到另一个对等数据库实例,反之亦然。在主动/主动复制下,没有主副本,并且对等数据库实例保持相同。

在主/从复制中,存在主数据库实例和多个从数据库实例。主副本是事实的源,并且可以接受读和写事务。对主数据库实例所做的改变被复制到从数据库实例。从数据库实例是只读的。

因此,在一个实施例中,存储在第一分片中的块中的数据可以被复制到一个或多个附加分片。可以使用主动/主动复制或主/从复制来执行块中的数据的这种复制。

重新分片

重新分片是在分片数据库中的分片之间重新分布数据的处理。重新分片可以由各种条件触发。重新分片涉及将块或块的一部分移动到新的分片。如前所述,块是分片之间的数据迁移的单元。通过将来自不同分片表的相关数据存储在同一个块中,并将块作为原子单元在分片之间移动,重新分片处理可以确保来自不同分片表的相关数据一起被移动。

在一个实施例中,当新的分片被添加到分片数据库时,可以触发重新分片处理。在这种情况下,重新分片处理可以是自动的,并且将自动在分片数据库中重新分布一个或多个块,以将块从旧分片移动到新分片。

在一个实施例中,当从分片数据库中移除分片时,可以触发重新分片处理。在这种情况下,重新分片处理可以是自动的,并且将自动将来自正从分片数据库中被移除的分片的一个或多个块重新分布到分片数据库中没有正在被移除的另一个分片。

在一个实施例中,当数据库管理员使用命令来手动分解或拆分特定块时,可以触发重新分片处理。这可以例如在数据库管理员认识到特定块尺寸过大并且需要被拆分成较小的块并且被重新分布时发生。尺寸过大的块可以被拆分成两个或更多个较小的块,这两个或更多个较小的块然后被重新分布到分片数据库中的分片。

在一个实施例中,当分片数据库检测到特定分片上的显著负载时,可以触发重新分片处理。为了均衡跨分片数据库的负载,分片数据库可以响应于检测到特定分片上的显著负载而识别特定分片上的要被重新分布到分片数据库中的其它分片的一个或多个块。在一个实施例中,对用于重新分布的一个或多个块的识别是随机的。

在一个实施例中,通过允许分片数据库响应于触发事件(诸如新添加或移除的分片、数据库管理的手动干预或者检测到特定分片上的显著负载)而重新配置数据的分布,执行重新分片的能力向分片数据库提供了弹性的可伸缩性。

图12A、图12B和图12C描绘了当新分片被添加到数据库时分片数据库的重新分片的示例。在图12A中,分片数据库包括分片1220、1230、1240和1250。当前,分片1220包括块1201、1202、1203和1204。分片1230包括块1205、1206、1207和1208。分片1240包括块1209、1210、1211和1212。此外,分片1250刚被添加到分片数据库。但是,由于分片是新的,因此分片1250还没有任何块。

在图12B中,对分别来自分片1220、1230和1240的块1204、1208和1212进行拷贝。块1204、1208和1212的拷贝被存储在分片1250中,并且这些块的原始拷贝从它们的原始分片1220、1230和1240中被删除。

图12C示出了重新分片处理的最终结果的示例。在重新分片完成之后,分片数据库中的块被重新分布如下:分片1220包括块1201、1202和1203;分片1230包括块1205、1206和1207;分片1240包括块1209、1210和1211;并且新分片1250包括从分片数据库中的其它分片重新分布的块1204、1208和1212。因此,分片数据库已响应于新的分片1250的添加而自动重新分布了分片数据库中的数据。响应于添加新分片的数据的这种自动重新分布提供了分片数据库中的负载均衡。

图13示出了根据一个实施例的用于重新分片的处理1300的流程图。在步骤1302中,分片导向器识别要从源分片移动到目的地分片的源块。如前所述,这可以响应于检测到源分片上的显著负载或响应于检测到添加到分片数据库的新分片而被自动完成。在这种情况下,可以基于从位于源分片的所有块中进行的随机选择来识别将被移动的源块。在另一个实施例中,可以响应于由数据库管理员提供的数据库命令(诸如拆分块或移动块的命令)来识别源块。处理1300然后可以前进到步骤1304。

在步骤1304中,分片导向器可以可选地确定分片数据库是否使用主动/主动复制。如果分片数据库使用主动/主动复制,那么副本中将存在源块的重复拷贝,该源块的重复拷贝可以被用于为需要在重新分片处理继续时访问源块中的数据的数据库查询服务。如果分片数据库不使用主动/主动复制,那么副本中可能不存在可用于为需要在重新分片处理继续时访问源块中的数据的数据库查询服务的源块的重复拷贝。如果分片数据库使用主动/主动复制,那么处理1300可以前进到步骤1306。如果分片数据库不使用主动/主动复制,那么处理1300可以前进到步骤1312。

在步骤1306中,由于分片导向器知道源块的拷贝从复制的源可用,因此分片导向器更新路由表以指示源块在源上不可用,但是包含在源块中的数据从包含源块的复制拷贝的复制分片可用。处理1300可以前进到步骤1308。

在步骤1308中,分片导向器向客户端应用通知对路由表的更新。该通知还将包括用于新映射的映射数据,以指示源块中包含的数据现在可以从复制的分片获得。因此,这将使客户端应用知道,对于在源块在源分片上不可用时需要访问源块的查询,它们可以继续直接将查询路由到复制的分片。这确保在源块被迁移到新的目的地分片时,客户端应用不会经历从源块访问它们所需的数据时的停机时间。处理1300然后可以前进到步骤1310。

在步骤1310中,分片导向器指示分片将源块从源分片拷贝到目的地分片。处理1300然后可以前进到步骤1320。

在步骤1312中,分片导向器指示目的地分片将源块的模糊(fuzzy)拷贝存储在目的地分片中。模糊拷贝是在源块仍可用于处理进一步查询时从源块产生的拷贝。因此,如果源块在拷贝处理期间被修改,那么源块的模糊拷贝可能不与源块完全相同。对源块进行的任何附加修改或更新将不会反映在模糊拷贝中。处理1300然后可以前进到步骤1314。

在步骤1314中,处理1300确定是否存在对于源分片上的源块的还未被反映在存储在目的地分片中的源块的模糊拷贝中的附加改变。如果存在模糊拷贝中还未反映的附加改变,那么处理1300可以前进到步骤1316。如果不存在模糊拷贝中还未反映的附加改变,那么源块的模糊拷贝和源块现在是完全相同的,并且处理1300前进到步骤1318。

在步骤1316中,处理1300将对源块做出的但尚未反映在模糊拷贝中的任何附加改变复制到模糊拷贝中。处理1300然后返回到步骤1314。

在步骤1318中,源块的模糊拷贝和源块现在完全相同,因此分片导向器使得源分片上的源块成为只读的。因此,源分片仍可用于读取查询,但是不能被更新。该处理然后前进到步骤1320。

在步骤1320中,分片导向器更新路由表,以指示现在源块在目的地分片上可用并且在源分片处不再可用。处理1300然后前进到步骤1322。

在步骤1322中,分片导向器通知客户端应用已经对路由表进行了更新。分片导向器发送来自路由表的更新映射数据,以指示现在源块在目的地分片而不是源分片处可用。因此,如果查询要求访问存储在块中的数据,那么客户端应用可以使用通知中包括的该更新后的映射数据来将后续查询直接路由到目的地分片。处理1300然后可以前进到步骤1324。

在步骤1324中,分片导向器可以指示源分片从源分片中删除源块,从而释放源分片上的存储空间。处理1300然后可以结束。

路由查询

典型OLTP客户端应用中的大多数查询是短的,并且必须以毫秒延迟进行处理。在将查询路由到适当的分片期间,额外的网络跳和解析可能引入对于OLTP客户端应用不可接受的延迟。本公开提供了用于在路由从客户端应用发送的查询时最小化延迟的技术。

返回图2,客户端应用210将需要进行分片数据库250的数据请求。在一些情况下,来自客户端应用210的数据请求将要求来自单个分片的数据。这种数据请求被称为单分片查询。单分片查询将表示典型OLTP客户端应用的大部分数据请求,因为分片260A、260B和260C已经被配置为使得每个分片中的块包含来自表家族的表的对应分区。因此,依赖于来自表家族的数据的大多数查询将有可能由单个分片服务,因为用于该表家族的相关数据并置(collocate)在同一个分片上。同样,对于相对小和/或静态的参考表使用重复的表提高了查询作为单分片查询被处理的可能性。

在其它情况下,来自客户端应用210的数据请求将要求来自多个分片的数据。这种数据请求称为跨分片查询。处理跨分片查询通常比处理单分片查询慢,因为它要求联接来自多个分片的数据。跨分片查询通常用于生成报告和收集需要来自多个分片的数据的统计信息。这种跨分片查询通常不是性能关键的。

如前所述,分片目录230维护路由表,该路由表将由每个分片托管的块的列表映射到与每个块相关联的散列值的范围。因此,路由表可以被用于针对分片键值或分片键值集来确定哪个分片包含包括用于分片键的数据的块。在一个实施例中,在数据库经由复合分片被分片的情况下,路由表还可以包括用于分片键和超级分片键的组合的映射信息。因此,在复合分片数据库的情况下,对于给定的分片键值集,路由表可以被用于确定哪个分片包含包括用于该分片键值集的数据的块。

在一个实施例中,由分片目录230维护的路由表被拷贝并且可由分片协调器访问。分片协调器是帮助将查询路由到适当的分片的部件。在一个实施例中,分片协调器被实现为分片导向器220的一部分。在另一个实施例中,分片协调器在客户端应用210中实现。在另一个实施例中,分片协调器在分片数据库250中的每个单独分片260中的一个或多个上实现。在另一个实施例中,分片协调器被实现为与分片导向器220和各个分片260分开的部件。例如,分片协调器可以被实现为在分片导向器220和各个分片260外部的软件部件。在一个实施例中,该软件部件可以是分片数据库250的一部分。在另一个实施例中,软件部件可以在分片数据库250的外部。在一个实施例中,软件部件可以在分片数据库250和客户端应用210的外部。

在一个实施例中,分片协调器功能可以跨存在于客户端应用210和分片数据库250之间的多个软件部件S1至SN分布。软件部件S1至SN可以具有对于客户端应用210和/或分片数据库260而言的不同的可访问性。这种可访问性反映了各种通信特点,包括但不限于物理接近度、带宽、计算资源的可用性、工作负载以及将影响软件部件S1至SN的可访问性的其它特点。

在一个实施例中,对于客户端应用210,软件部件S1可以比软件部件S2更容易访问。同样,对于客户端应用210,软件部件S2可以比软件部件S3更容易访问,等等。因此,软件部件S1被认为最靠近客户端应用210,因为它是客户端应用210最容易访问的,并且软件部件SN被认为离客户端应用210最远,因为它对客户端应用210而言是最不可访问的。在一个实施例中,当在客户端应用210处创建要求由分片协调器处理的数据库请求时,最靠近客户端应用210的可用软件部件被用作分片协调器,以尝试处理数据库请求。如果最靠近客户端应用210的可用软件部件不能处理数据库请求,那么尝试下一个最靠近的软件部件,等等,直到数据库请求由分片协调器成功处理为止。例如,如果软件部件没有用于正确路由数据库请求的足够的映射数据,那么它可能无法处理数据库请求。通过使用最靠近客户端应用210的可用软件部件来充当将处理数据库请求的分片协调器,系统可以在处理请求时提供改进的性能,因为与其它软件部件相比,最靠近的可用软件部件具有改进的可访问性。

对于具有已知键的单分片查询的基于代理的查询路由

在一个实施例中,客户端应用210不能将数据库请求中的查询直接路由到分片,因为它不能独立地确定哪个(哪些)目标分片包含处理查询所需的数据。客户端应用210可以使用分片协调器来执行到(一个或多个)目的地分片的基于代理的路由。

图14示出了根据一个实施例的用于单分片查询的基于代理的查询路由的处理1400的流程图。在步骤1402中,客户端应用210向分片协调器发送包括单分片查询的数据库请求。该数据库请求包括分片键,并且可选地,还可以包括超级分片键。处理1400然后前进到步骤1404。

在步骤1404中,分片协调器可以使用键和路由表来确定哪个目标分片包含处理数据库请求的单分片查询所需的数据。处理1400然后前进到步骤1406。

在步骤1406中,分片协调器将客户端应用210直接重定向到包含处理单分片查询所需的数据的目标分片。通过将客户端应用210重定向到目标分片而不是仅仅将目标分片的标识返回给客户端应用210,处理1400可以移除在处理单分片查询中的不必要的跳,从而改进系统延迟。处理1400然后前进到步骤1408。

在步骤1408中,客户端应用210可以直接在目标分片上执行单分片查询并且直接从目标分片接收查询的结果。处理1400然后前进到步骤1410。

在步骤1410中,目标分片还可以可选地返回识别特定分片存储的所有键范围的映射数据。这种映射数据可以由客户端应用210直接高速缓存或在客户端应用210可访问的连接池中高速缓存。映射数据将允许客户端应用210将具有与被高速缓存的映射数据匹配的分片键的后续查询直接路由到目标分片,而不需要咨询分片协调器。这将改进对目标分片的后续数据库请求的性能。处理1400然后可以结束。

对于未知的分片键的基于代理的查询路由

图15示出了当由客户端应用210发送的数据库请求不包括分片键时用于基于代理的查询路由的处理1500的流程图。例如,当正在使用遗留(legacy)客户端应用访问分片数据库并且数据库请求尚未被更新为包括分片键时,可以使用该处理1500。可替代地,当客户端应用210正在执行需要来自多个分片的数据的跨分片查询时,可以使用该处理1500。

在步骤1502中,客户端应用210将包括查询的数据库请求发送到不包括分片键的分片协调器。处理1500然后前进到步骤1504。

在步骤1504中,分片协调器解析数据库请求中的查询并确定对于查询的分片键的值。分片协调器可以将分片键与路由表进行比较,以确定包含处理查询所需的数据的(一个或多个)目标分片。处理1500然后前进到步骤1506。

在步骤1506中,分片协调器将查询发送到在步骤1504中识别出的每个分片。处理1500然后前进到步骤1508。

在步骤1508中,(一个或多个)分片中的每一个分片处理查询并将处理查询的结果返回到分片协调器。处理然后前进到步骤1510。

在步骤1510中,分片协调器聚合并过滤在步骤1508中接收到的来自(一个或多个)分片的结果。此外,分片协调器将聚合结果返回给客户端应用210。处理1500然后可以结束。

在另一个实施例中,图15B示出了当由客户端应用210发送的数据库请求不包括分片键时用于基于代理的查询路由的处理1501的流程图。在步骤1522中,客户端应用210将包括查询的数据库请求发送到不包括分片键的分片协调器。处理1501然后前进到步骤1524。

在步骤1524中,分片协调器解析数据库请求中的查询并确定对于查询的分片键的值。然后,分片协调器可以将分片键与路由表进行比较,以确定包含处理查询所需的数据的(一个或多个)分片。处理1501然后前进到步骤1526。

在步骤1526中,分片协调器将查询的谓词(predicate)发送到在步骤1524中识别出的每个分片。处理1501然后前进到步骤1528。

在步骤1528中,(一个或多个)分片中的每一个分片处理谓词并将谓词结果发送到分片协调器。处理然后前进到步骤1530。

在步骤1530中,分片协调器从(一个或多个)分片接收谓词结果,然后将查询应用于谓词结果。将查询应用于谓词结果的最终结果然后可以被返回给客户端应用210。处理1501然后可以结束。

使用被高速缓存的映射数据的到分片的直接路由

在一个实施例中,客户端应用210可以使用被高速缓存的映射数据来将查询直接路由到特定分片260。在这个示例中,客户端应用210可以使用在客户端应用210中被高速缓存或在客户端应用210可访问的连接池中被高速缓存的映射数据来确定哪个特定的分片260包含用于特定查询的数据。例如,当用于客户端应用210的客户端连接池第一次连接到特定分片时,它可能需要使用分片协调器来路由第一查询,因为客户端应用210不知道需要哪个特定分片来处理第一查询。该特定分片可以处理第一查询并返回响应。除了提供对第一查询的响应之外,该特定分片还返回识别该特定分片存储的所有键范围的映射数据。客户端应用210或连接池可以高速缓存用于该特定分片的键范围映射。

因此,对于需要存储在特定分片上的数据的后续查询,客户端应用210可以使用被高速缓存的映射数据来将查询直接路由到该特定分片,而无需访问中间分片协调器。因此,在单分片查询的情况下,客户端应用210可以将后续查询直接路由到特定分片,并且将结果直接返回给客户端应用210。使用已知键直接路由到分片可以提供改进的延迟,因为客户端应用210可以直接访问分片而无需为了处理查询来咨询中间的分片协调器。

在一个实施例中,当将查询直接路由到分片时,可以将查询的谓词自动添加到查询,以将由分片输出的查询限制为所提供的(一个或多个)键值。例如,如果在建立数据库连接时指定了“cust_id=123”,然后通过该数据库连接执行“SELECT*FROM customers”,那么可以将该查询重写为“SELECT*FROM customers where cust_id=123”。查询可以由客户端应用、连接池或分片协调器重写。这种行为是可选的,并且可以由用于分片数据库的用户定义的参数控制。

关于在客户端应用210和分片之间直接路由查询的进一步细节可以在于2016年4月20日提交的美国专利申请No.15/133,972(“SYSTEM AND METHOD FOR PROVIDING DIRECTACCESS TO A SHARDED DATABASE”)以及于2016年4月20日提交的美国专利申请No.15/133,979(“SYSTEM AND METHOD FOR PROVIDING ACCESS TO A SHARDED DATABASE USING ACACHE AND A SHARD TECHNOLOGY”)中找到,这两个申请中的每个申请的内容通过引用并入本文,如同在此完全阐述一样。

基于查询的客户端解析的到分片的直接路由

在一个实施例中,客户端应用210可以解析查询,以便确定处理查询需要使用的(一个或多个)分片,而无需咨询分片协调器。在一个实例中,跨分片表的包括“SELECT*”语句的查询可以由客户端应用210解析。基于解析,客户端应用210可以识别出“SELECT*”语句将要求来自分片数据库中的所有分片的数据。因此,客户端应用210可以将查询直接路由到分片数据库中的所有分片,而不是使用中间的分片协调器来路由查询。例如,客户端应用210可以将查询直接路由到客户端应用210可访问的被高速缓存的映射数据中识别出的所有分片。

用于查询路由的组合处理

在一个实施例中,各种基于代理的路由技术和直接路由技术可以被组合到用于查询路由的组合处理中,当客户端应用210能够执行直接路由时该组合处理使用直接路由,并且当客户端应用210无法执行直接路由时,该组合处理使用基于代理的路由。这种组合处理提供了直接路由的改进延迟的益处,同时保留了使用基于代理的路由执行跨分片查询的能力以及当客户端应用210不知道哪个(哪些)分片包含处理查询所必需的数据时访问(一个或多个)分片的能力。

图16示出了用于查询路由的组合处理的示例流程图。在步骤1601中,客户端应用210确定它是否可以访问分片键。如果客户端应用可以访问分片键,那么处理1600可以前进到步骤1602。如果客户端应用210不能访问分片键,那么处理1600可以前进到步骤1612。

在步骤1602中,客户端应用210确定它是否可以访问用于分片键的被高速缓存的映射数据。被高速缓存的映射数据是包括用于分片数据库中的(一个或多个)特定分片的键值范围的映射数据。如果客户端应用210能够使用分片键从被高速缓存的映射数据中确定哪个(哪些)分片包含处理查询所必需的数据,那么处理1600可以前进到步骤1604。如果客户端应用210无法使用分片键从被高速缓存的映射数据中确定哪个(哪些)分片包含处理查询所必需的数据,那么处理1600可以前进到步骤1606。

在步骤1604中,客户端应用210可以直接连接到包含处理查询所必需的数据的(一个或多个)分片并且直接在(一个或多个)分片上执行查询。(一个或多个)分片将查询的结果直接返回给客户端应用210。处理1600然后可以结束。

在步骤1606中,客户端应用210可以确定查询是否足够简单,以确定哪个(哪些)分片包含处理查询所必需的数据。例如,如果查询包括“SELECT*”语句,那么客户端应用210可以确定查询需要由分片数据库中的所有的(一个或多个)分片处理。如果客户端应用210确定查询足够简单,那么处理1600可以前进到步骤1608,否则处理1600可以前进到步骤1612。

在步骤1608中,客户端应用210可以分析查询,以确定哪个(哪些)目标分片包含处理查询所必需的数据。处理1600然后可以前进到步骤1610。

在步骤1610中,客户端应用210可以直接连接到包含处理查询所必需的数据的(一个或多个)分片并直接在(一个或多个)分片上执行查询。(一个或多个)分片将查询的结果直接返回给客户端应用210。处理1600然后可以结束。

在步骤1612中,客户端应用210可以将查询发送到分片协调器,以协助对查询进行基于代理的路由。处理1600然后可以前进到步骤1614。

在步骤1614中,分片协调器可以分析查询,以确定查询的分片键。分片协调器可以使用分片键和路由表来确定哪个(哪些)分片包含处理查询所必需的数据。处理1600可以前进到步骤1616。

在步骤1616中,分片协调器可以确定查询是否是单分片查询。如果查询是单分片查询,那么处理1600然后可以前进到步骤1620。如果查询是跨分片查询,那么处理1600然后可以前进到步骤1618。

在步骤1618中,分片协调器促进对于跨分片查询的查询处理。在一个实施例中,分片协调器将向(一个或多个)目标分片中的每一个发送查询,并且(一个或多个)目标分片将处理该查询。(一个或多个)目标分片将结果返回到分片协调器,分片协调器将聚合并过滤结果。分片协调器将跨分片查询的最终聚合结果发送回客户端应用210。处理1600然后可以结束。

在步骤1620中,分片协调器可以将客户端应用210重新引导到包含处理单分片查询所必需的数据的目标分片。处理1600然后可以前进到步骤1622。

在步骤1622中,客户端应用210可以直接连接到目标分片并且在目标分片上执行查询。执行查询的结果直接从目标分片返回到客户端应用210。处理1600然后可以结束。

模式变化的自动传播

可以经由数据定义语言(DDL)对数据库模式进行改变。在分片数据库中有大量分片的情况下,具有跨分片数据库传播模式改变的高效的方式是重要的。在一些常规的分片数据库中,跨分片数据库的数据库模式改变由客户手动编写的脚本语言或应用完成。通过手动连接到每个分片并将代码或脚本语言应用到每个分片,应用代码或脚本语言被用于跨分片数据库中的所有分片传播模式改变。这种应用代码或脚本语言不像DDL那样统一或健壮。而且,这种代码或脚本语言容易出现用户错误。在其它分片数据库中,跨分片数据库的数据库模式改变通过数据库管理员对每个分片单独地应用用于模式改变的DDL来手动完成。这种方法是不期望的,因为一些分片数据库包括数百个或数千个分片,并且由数据库管理员进行的这种手动工作耗时且容易出错。

本系统提供使用DDL的数据库模式改变到分片数据库中的分片的自动传播。在一个实施例中,分片目录230可以保留已经接收到的模式修改指令的历史。每个模式修改指令都被写为DDL请求。这些DDL请求可以由数据库管理员在分片目录230处直接输入。

分片目录230可以维护指示将DDL请求应用于分片数据库中的每个特定分片的状态的历史日志。因此,历史逻辑指示哪些DDL请求已被应用于分片,以及哪些DDL请求正在等待被应用于分片。在一些情况下,DDL请求可以已被应用于某些分片,但不是所有分片。在一个实施例中,数据库管理员可以指示应当何时将未决的DDL请求应用于分片数据库的时间表。时间表可以被发送到分片导向器220,并且分片导向器220可以延迟执行未决的DDL请求,直到在时间表中指定的时间。

在一个实施例中,分片目录230可以将未决的DDL请求推送到分片导向器220。分片导向器220负责在分片260处应用未决的DDL请求。分片导向器220可以访问指示哪些分片已应用任何历史DDL请求以及未决的DDL请求的历史日志。

分片导向器220可以充当与分片260相关的数据库客户端。因此,分片导向器220可以从分片目录230接收未决的DDL请求,连接到分片260中的每一个,并且对分片260中的每一个执行未决的DDL请求。在一个实施例中,每个分片上的模式改变的执行并行地进行。在一个实施例中,分片260可以向分片导向器220返回状态消息,以指示未决DDL请求是否在给定分片上成功执行。分片导向器220可以将接收到的状态消息中继到分片目录230,使得数据库管理员可以查看它们。同样,可以更新历史日志,以指示DDL请求是否已成功应用于特定分片。

在一个实施例中,分片导向器220可以充当可以接收提供来自分片260的状态信息的通知的收听者。状态信息可以包括分片是可用还是不可用。在一个实施例中,分片导向器220可以延迟将未决的DDL请求应用于分片,直到该分片可用。例如,如果分片数据库具有三个分片A、B和C。分片A和B可用,但分片C不可用。分片导向器220可以立即将DDL请求应用于分片A和B并相应地更新历史日志。然后分片导向器可以等待,直到分片C可用为止,因为分片导向器将在分片C变得可用时从分片C接收状态更新。一旦分片C变得可用,分片导向器220就可以使用历史日志来确定尚未应用于分片C的所有未决的DDL请求,并且依次应用它们,直到用未完成的(outstand)所有模式修改指令完全更新分片C的模式。

在另一个实施例中,状态信息可以包括关于分片正在经历的工作负载的指示。在一个实施例中,分片导向器220可以延迟将未决的DDL请求应用于分片,直到分片数据库中的所有分片具有小于阈值设置的工作负载为止。通过延迟应用未决的DDL,分片导向器220可以确保仅当性能影响可接受时DDL才被应用于分片数据库中的分片。

当分片导向器220在分片数据库中的分片上执行给定的DDL请求时,分片具有存储在其上的足够的元数据以识别出分片仅仅是更大的分片数据库中的一个数据库实例。因此,分片可以通过仅执行DDL请求的将影响分片的部分来执行DDL请求。例如,假如DDL请求是“CREATE SHARDED TABLE”请求。在普通的数据库实例中,“CREATE TABLE”请求将创建完整形成的(fully-formed)独立数据库表连同用于表数据对象的相关元数据。但是,在本系统的分片中,当它接收到“CREATE SHARDED TABLE”DDL请求时,作为创建完整形成的独立数据库表的替代,分片可以使用关于分片数据库作为整体的配置的所存储的元数据来创建分片表的分区,分片表的分区将被存储在分片本身上找到的块中,而不必创建将存储在位于不同分片中的块中的表的其余部分。以这种方式,通过允许分片仅执行DDL请求的影响它们自己的分片的部分而不必执行DDL请求的完整内容,DDL传播可以改进系统性能。

这个系统允许数据库管理员跨分片数据库中的大的分片集自动进行模式改变。数据库管理员只需向分片目录提供指定模式改变的DDL,并且这些改变将自动传播到分片数据库中的每个分片以供执行。这不是用于传播DDL请求的应用代码或脚本,也不需要数据库管理员手动连接到每个单独的分片来传播DDL模式改变。

语法

虽然本公开提供了用于如何创建、管理和操纵分片数据库的语法的各种示例,但这些示例仅仅是说明性的。本系统可以使用现有的关系数据库编码语言或查询语言(诸如结构化查询语言(SQL))来实现。这意味着遗留系统可以容易地升级、迁移或连接到包括本文描述的分片数据库教导的系统,因为将不需要对SQL进行重大改变。数据操纵语言(DML)的使用不需要任何改变就可以利用本系统的益处。此外,DDL的使用只需要很小的改变,以支持实现分片数据库的分片组织所必需的关键字。

数据库概述

本发明的实施例用在数据库管理系统(DBMS)的上下文中。因此,提供了示例DBMS的描述。

一般而言,诸如数据库服务器之类的服务器是集成的软件部件和计算资源(诸如存储器、节点以及节点上的用于执行集成的软件部件的进程)的分配的组合,其中软件和计算资源的组合专用于代表服务器的客户端提供特定类型的功能。数据库服务器支配(govern)并促进对特定数据库的访问,从而处理客户端访问数据库的请求。

数据库包括存储在永久存储器机制(诸如硬盘的集合)上的数据和元数据。例如,根据关系和/或对象-关系数据库结构,这些数据和元数据可以逻辑地被存储在数据库中。

用户通过向DBMS的数据库服务器提交命令来与数据库服务器进行交互,这些命令使数据库服务器对存储在数据库中的数据执行操作。用户可以是运行在与数据库服务器交互的客户端计算机上的一个或多个应用。多个用户在本文也可以被统称为用户。

数据库命令可以是数据库语句的形式。为了让数据库服务器处理数据库语句,数据库语句必须符合数据库服务器支持的数据库语言。许多数据库服务器支持的数据库语言的一个非限制性示例是SQL,包括诸如Oracle(例如Oracle Database 11g)之类的数据库服务器所支持的SQL的专有形式。将SQL数据定义语言(“DDL”)指令发布到数据库服务器,以创建或配置数据库对象,诸如表、视图或复杂类型。数据操纵语言(“DML”)指令被发布到DBMS,以管理存储在数据库结构内的数据。例如,SELECT、INSERT、UPDATE和DELETE是在一些SQL实现中找到的DML指令的常见示例。SQL/XML是在对象-关系数据库中操纵XML数据时使用的SQL的常见扩展。

一般而言,数据被存储在一个或多个数据容器中的数据库中,每个容器包含记录,并且每个记录内的数据被组织成一个或多个字段。在关系数据库系统中,数据容器通常被称为表,记录被称为行,而字段被称为列。在面向对象的数据库中,数据容器通常被称为对象类,记录被称为对象,而字段被称为属性。其它数据库体系架构可以使用其它术语。实现本发明的系统不限于任何特定类型的数据容器或数据库体系架构。但是,为了解释的目的,本文使用的示例和术语将是通常与关系数据库或对象-关系数据库相关联的示例和术语。因此,本文使用术语“表”、“行”和“列”分别是指数据容器、记录和字段。

多节点数据库管理系统由共享对相同数据库的访问的互连节点组成。通常,节点经由网络互连,并以不同程度共享对共享存储装置的访问,例如,共享对盘驱动器集合以及存储在其上的数据块的访问。多节点数据库系统中的节点可以是经由网络互连的一组计算机(例如,工作站、个人计算机)的形式。可替代地,节点可以是网格的节点,网格由与机架上的其它服务器刀片互连的服务器刀片形式的节点组成。

多节点数据库系统中的每个节点托管数据库服务器。诸如数据库服务器之类的服务器是集成的软件部件和计算资源(诸如存储器、节点以及节点上的用于在处理器上执行集成的软件部件的进程)的分配的组合,其中软件和计算资源的组合专用于代表一个或多个客户端执行特定的功能。

来自多节点数据库系统中的多个节点的资源可以被分配以运行特定数据库服务器的软件。软件和来自节点的资源分配的每种组合是在本文被称为“服务器实例”或“实例”的服务器。数据库服务器可以包括多个数据库实例,这些数据库实例中的一些或全部在分离的计算机(包括分离的服务器刀片)上运行。

查询优化和执行计划

查询优化为查询生成一个或多个不同的候选执行计划,查询优化器对该一个或多个不同的候选执行计划进行评估,以确定应当使用哪个执行计划来计算查询。

执行计划可以由互相链接的节点(在本文被称为运算符或行源)的图表示,每个节点与执行计划的步骤(在本文被称为执行计划操作)对应。图的层次结构(即,有向树)表示执行计划操作的执行次序以及数据在执行计划操作中的每个执行计划操作之间如何流动。执行计划运算符生成行的集合(其可以被称为表)作为输出,并且执行计划操作包括例如表扫描、索引扫描、排序-合并联接、嵌套-循环联接、过滤器等,并且重要的是完整的外联接。

查询优化器可以通过变换查询来优化查询。一般而言,变换查询涉及将查询重写为另一个语义上等价的查询,该另一个语义上等价的查询应当产生相同的结果并且潜在地可以被更高效地执行,即,可以为其生成潜在地更高效且成本更低的执行计划的查询。查询变换的示例包括视图合并、子查询解嵌套、谓词移动和下推、常用子表达式消除、外部到内部联接转换、物化视图重写以及星形变换。

硬件概述

现在参考图17,图17是示出其中可以体现本发明的(一个或多个)示例实施例的基本计算设备1700的框图。计算设备1700及其部件,包括它们的连接、关系和功能,仅意味着是示例性的,并不意味着限制(一个或多个)示例实施例的实现。适于实现(一个或多个)示例实施例的其它计算设备可以具有不同的部件,包括具有不同连接、关系和功能的部件。

计算设备1700可以包括总线1702或其它通信机制,以用于对主存储器1706寻址并且用于在设备1700的各个部件之间传送数据。

计算设备1700还可以包括与总线1702耦合的用于处理信息的一个或多个硬件处理器1704。硬件处理器1704可以是通用微处理器、片上系统(SoC)或其它处理器。

诸如随机存取存储器(RAM)或其它动态存储设备之类的主存储器1706还可以耦合到总线1702,以用于存储信息和要由(一个或多个)处理器1704执行的软件指令。主存储器1706还可以用于在执行要由(一个或多个)处理器1704执行的软件指令期间存储临时变量或其它中间信息。

软件指令当被存储在(一个或多个)处理器1704可访问的存储介质中时,使得计算设备1700成为被定制为执行软件指令中指定的操作的专用计算设备。术语“软件”、“软件指令”、“计算机程序”、“计算机可执行指令”和“处理器可执行指令”应当被广义地解释为覆盖用于指示计算设备执行具体操作的任何机器可读信息(无论人类是否可读),并且包括但不限于应用软件、桌面应用、脚本、二进制文件、操作系统、设备驱动程序、引导装载程序、shell、实用程序、系统软件、JAVASCRIPT、网页、web应用、插件、嵌入式软件、微码、编译器、调试器、解释器、虚拟机、链接器和文本编辑器。

计算设备1700还可以包括耦合到总线1702的只读存储器(ROM)1708或其它静态存储设备,以用于存储用于(一个或多个)处理器1704的静态信息和软件指令。

一个或多个大容量存储设备1710可以耦合到总线1702,以用于在诸如磁性、光学、固态、磁-光、闪存或任何其它可用的大容量存储技术之类的固定或可移动介质上持久地存储信息和软件指令。大容量存储装置可以在网络上共享,或者可以是专用的大容量存储装置。通常,大容量存储设备1710中的至少一个(例如,设备的主硬盘)存储用于指导计算设备的操作的程序和数据的主体,包括操作系统、用户应用程序、驱动程序和其它支持文件以及其它各种数据文件。

计算设备1700可以经由总线1702耦合到显示器1712,诸如液晶显示器(LCD)或其它电子可视显示器,以用于向计算机用户显示信息。在一些配置中,结合触摸检测技术(例如,电阻式、电容式等等)的触敏表面可以被覆盖在显示器1712上,以形成用于将触摸手势(例如,手指或触控笔)输入传送到(一个或多个)处理器1704的触敏显示器。

包括字母数字键和其它键的输入设备1714可以耦合到总线1702,以用于向处理器1704传送信息和命令选择。除了字母数字键和其它键之外或者作为字母数字键和其它键的代替,输入设备1714还可以包括一个或多个物理按钮或开关,诸如例如电源(开/关)按钮、“主页”按钮、音量控制按钮等。

另一种类型的用户输入设备可以是光标控件1716(诸如鼠标、轨迹球或光标方向键),以用于向处理器1704传送方向信息和命令选择并且用于控制显示器1712上的光标移动。这种输入设备通常具有允许设备在平面中指定位置的在两个轴(第一轴(例如,x)和第二轴(例如,y))上的两个自由度。

虽然在一些配置(诸如图17所绘出的配置)中,显示器1712、输入设备1714和光标控件1716中的一个或多个是计算设备1700的外部部件(即,外围设备),但是显示器1712、输入设备1714和光标控件1716中的一些或全部在其它配置中作为计算设备1700的形状因子的一部分被集成。

所公开的系统、方法和模块的功能可以由计算设备1700响应于(一个或多个)处理器1704执行包含在主存储器1706中的软件指令的一个或多个程序而执行。这种软件指令可以从另一个存储介质(诸如(一个或多个)存储设备1710)读取到主存储器1706中。包含在主存储器1706中的软件指令的执行使(一个或多个)处理器1704执行(一个或多个)示例实施例的功能。

虽然(一个或多个)示例实施例的功能和操作可以完全用软件指令来实现,但是计算设备1700的硬连线或可编程电路系统(例如,ASIC、FPGA等)可以在其它实施例中根据当前(at hand)特定实现的要求而代替软件指令或与软件指令相结合使用以执行功能。

如本文所使用的,术语“存储介质”是指存储使计算设备以特定方式操作的数据和/或软件指令的任何非暂态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如非易失性随机存取存储器(NVRAM)、闪存、光盘、磁盘或固态驱动器,诸如存储设备1710。易失性介质包括动态存储器,诸如主存储器1706。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带、或者任何其它磁性数据存储介质、CD-ROM、任何其它光学数据存储介质、具有孔的图案的任何物理介质、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、闪存、任何其它存储器芯片或盒式磁带。

存储介质与传输介质不同但是可以与传输介质结合使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴线缆、铜线和光纤,包括包含总线1702的线。传输介质还可以采取声波或光波的形式,诸如在无线电数据通信和红外数据通信期间生成的声波或光波。

把一条或多条软件指令的一个或多个序列携带到(一个或多个)处理器1704以供执行可以涉及各种形式的介质。例如,软件指令最初可以在远端计算机的磁盘或固态驱动器上携带。远端计算机可以把软件指令加载到其动态存储器中并且利用调制解调器经电话线发送软件指令。位于计算设备1700本地的调制解调器可以接收电话线上的数据并且使用红外发射器把数据转换成红外信号。红外检测器可以接收在红外信号中携带的数据并且适当的电路系统可以把数据放在总线1702上。总线1702把数据携带到主存储器1706,(一个或多个)处理器1704从主存储器1706检索并执行软件指令。由主存储器1706接收的软件指令可以可选地在被(一个或多个)处理器1704执行之前或之后存储在(一个或多个)存储设备1710上。

计算设备1700还可以包括耦合到总线1702的一个或多个通信接口1718。通信接口1718提供耦合到有线或无线网络链路1720的双向数据通信,该有线或无线网络链路1720连接到本地网络1722(例如,以太网、无线局域网、蜂窝电话网络、蓝牙无线网络等)。通信接口1718发送和接收携带表示各种类型的信息的数字数据流的电信号、电磁信号或光信号。例如,通信接口1718可以是有线网络接口卡、具有集成的无线电天线的无线网络接口卡或调制解调器(例如,ISDN、DSL或线缆调制解调器)。

(一个或多个)网络链路1720通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路1720可以通过本地网络1722提供到主机计算机1724或到由互联网服务提供商(ISP)1726运营的数据装备的连接。ISP 1726又通过现在通常称为“互联网”1728的全球分组数据通信网络提供数据通信服务。(一个或多个)本地网络1722和互联网1728使用携带数字数据流的电信号、电磁信号或光信号。将数字数据携带到计算设备1700和携带来自计算设备1700的数字数据的通过各种网络的信号以及(一个或多个)网络链路1720上的并且通过(一个或多个)通信接口1718的信号是传输介质的示例形式。

计算设备1700可以通过(一个或多个)网络、(一个或多个)网络链路1720和(一个或多个)通信接口1718发送消息和接收数据,包括程序代码。在互联网示例中,服务器1730可以通过互联网1728、ISP 1726、(一个或多个)本地网络1722和(一个或多个)通信接口1718发送对于应用程序的请求代码。

所接收的代码可以在其被接收时由处理器1704执行,和/或被存储在存储设备170或其它非易失性存储装置中,以供随后执行。

软件概述

图18是可以被用于控制计算设备1700的操作的基本软件系统1800的框图。软件系统1800及其部件,包括它们的连接、关系和功能,仅意味着是示例性的,并不意味着限制(一个或多个)示例实施例的实现。适于实现(一个或多个)示例实施例的其它软件系统可以具有不同的部件,包括具有不同连接、关系和功能的部件。

提供软件系统1800是为了指引计算设备1700的操作。可以存储在系统存储器(RAM)1706中以及固定存储装置(例如,硬盘或闪存)1710上的软件系统1800包括内核或操作系统(OS)1810。

OS 1810管理计算机操作的低级方面,包括管理进程的执行、存储器分配、文件输入和输出(I/O)以及设备I/O。被表示为1802A、1802B、1802C...1802N的一个或多个应用程序可以被“加载”(例如,从固定存储装置1710传送到存储器1706中)以供系统1800执行。旨在于设备1800上使用的应用或其它软件还可以被存储为可下载的计算机可执行指令集,例如用于从互联网位置(例如,Web服务器、应用商店或其它在线服务)下载和安装。

软件系统1800包括图形用户界面(GUI)1815,用于以图形(例如,“点击”或“触摸手势”)方式接收用户命令和数据。这些输入又可以由系统1800根据来自操作系统1810和/或(一个或多个)应用1802的指令来对其起作用。GUI 1815还用于显示来自OS 1810和(一个或多个)应用1802的操作结果,在其上用户可以提供附加的输入或终止会话(例如,注销)。

OS 1810可以直接在设备1700的裸硬件1820(例如,(一个或多个)处理器1704)上执行。可替代地,管理程序或虚拟机监视器(VMM)1830可以介于裸硬件1820和OS 1810之间。在这种配置中,VMM 1830充当设备1700的OS 1810和裸硬件1820之间的软件“缓冲垫”或虚拟化层。

VMM 1830实例化并运行一个或多个虚拟机实例(“访客机器”)。每个访客机器包括“访客”操作系统(诸如OS 1810)以及被设计为在访客操作系统上执行的一个或多个应用(诸如(一个或多个)应用1802)。VMM 1830向访客操作系统呈现虚拟操作平台并管理访客操作系统的执行。

在一些情况下,VMM 1830可以允许访客操作系统运行,就好像它直接在设备1700的裸硬件1820上运行一样。在这些情况下,被配置为直接在裸硬件1820上执行的访客操作系统的相同版本还可以在VMM 1830上执行而无需修改或重新配置。换句话说,在一些情况下,VMM 1830可以向访客操作系统提供完整的硬件和CPU虚拟化。

在其它情况下,访客操作系统可以被特殊设计或配置为在VMM 1830上执行以提高效率。在这些情况下,访客操作系统“知道”它在虚拟机监视器上执行。换句话说,在一些情况下,VMM 1830可以向访客操作系统提供半虚拟化(para-virtualization)。

上文描述的基本计算机硬件和软件是为了说明可以被用于实现(一个或多个)示例实施例的基本底层计算机部件而给出的。但是,(一个或多个)示例实施例不一定限于任何特定的计算环境或计算设备配置。相反,(一个或多个)示例实施例可以在本领域技术人员根据本公开将理解为能够支持本文给出的(一个或多个)示例实施例的特征和功能的任何类型的系统体系架构或处理环境中实现。

扩展和替代

虽然前述说明书中描述的附图中的一些附图包括具有以一定次序示出的步骤的流程图,但是这些步骤可以以任何次序执行,而不限于那些流程图中示出的次序。此外,一些步骤可以是可选的、可以多次执行、和/或可以由不同的部件执行。在本文描述的流程图的所有步骤、操作和功能旨在指示在各种实施例中使用专用计算机或通用计算机中的编程执行的操作。换句话说,本公开中的每个流程图结合本文的相关文本是用于对计算机进行编程以执行所描述的功能的算法的全部或部分的指南、计划或规范。与本公开相关联的领域中的技术水平已知是高的,并且因此本公开中的流程图和相关文本已经准备好以当技术人员在他们之间交流关于程序、算法及其实现时在该领域中通常期望的水平的充足性和细节来传达信息。

在前面的说明书中,已经参考许多具体细节描述了本发明的(一个或多个)示例实施例。但是,根据当前特定实现的要求,细节可以因实现而异。因而,(一个或多个)示例实施例应当被认为是说明性的而不是限制性的。

技术分类

06120114704316