在分片数据库环境中处理半结构化和非结构化数据的制作方法

文档序号:20605688发布日期:2020-05-01 22:04阅读:176来源:国知局
本发明涉及数据库系统,更具体而言,涉及其中分片表存储半结构化数据项的数据库系统。
背景技术
::存储越来越多的数据的数据库系统正变得越来越普遍。例如,在线交易处理(oltp)系统,诸如电子商务、移动、社交和软件即服务(saas)系统,通常需要大型数据库存储装置。oltp系统的示例应用包括但不限于大型计费系统、票务系统、在线金融服务、媒体公司、在线信息服务和社交媒体公司。给定这些数据库系统存储的大量数据,将所有数据存储在单个数据库实例上是不切实际的,因为大量数据会利用大量的计算资源,诸如处理器、存储器和存储装置。此外,非关系数据库(有时也称为nosql数据库)没有提供关系数据库的全部功能。例如,nosql数据库没有提供与关系数据库相同的模式控制、原子性、一致性、隔离性、持久性或功能全面的结构化查询语言(sql)。为了更高效地处理结构化良好的关系数据,已开发了用于“水平分区”数据库的技术。水平分区涉及将单个较大的表分解成更小、更易于管理的信息子集,称为“分区”。分片是数据层体系架构,其中数据跨独立的数据库实例进行水平分区,其中每个独立的数据库实例被称为“碎片”。碎片的集合一起构成单个逻辑数据库,其被称为“分片数据库”(“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那样进行访问。图2是分片数据库系统的框图。客户端应用210是需要访问存储在数据库中的数据的任何种类的客户端应用。分片数据库250是逻辑数据库,其中数据跨独立的数据库实例进行水平分区。具体而言,存储在分片数据库250中的数据被水平分区并存储在碎片260a、260b和260c中。分片数据库可以包括任何数量的碎片,并且分片数据库中碎片的数量可能随时间而变化。碎片260a、260b和260c中的每一个可以是其自己的数据库实例,该实例确实需要与分片数据库250中的其它碎片共享物理资源,诸如处理器、存储器和/或存储设备。碎片目录230是特殊的数据库系统,其用于存储分片数据库250的配置数据,并且可以包括例如:映射哪个碎片存储与给定值、值的范围或分片密钥的值的集合对应的一块数据的路由表、分片拓扑数据、碎片260a、260b和260c的配置、目录服务器220的配置、关于客户端应用210的信息等。目录服务器220协调跨分片数据库250的各种功能,包括但不限于:将数据库请求路由到碎片、将数据库模式更改传播到碎片、监视碎片的状态、从碎片接收状态更新、从客户端应用接收通知、向碎片发送通知、向客户端应用发送通知,和/或协调影响分片数据库260的配置的各种操作,诸如重新分片操作。由分片数据库使用的水平分区技术通过消除性能瓶颈并通过添加其它碎片并跨分片分配负载使得可以提高系统的性能和容量来提高可伸缩性。但是,即使常规的关系数据库系统采用水平分区,也无法充分满足所有用户的需求,因为这些系统没有提供允许无模式查询、索引和搜索能力的敏捷文档-对象存储模型。因此,对于处理半结构化数据和非结构化数据的用户,水平分区常规关系表是不够的。术语“半结构化和非结构化数据”是指未知严格遵循任何显式定义的模式的数据项。想要同时使用结构化和非结构化数据进行水平分区的用户通常必须维护多个分片系统,并构建本地的中间层来集成这两个系统。因此,显然需要一种系统,该系统提供水平分区的益处,而不管基础数据是完全结构化的、半结构化的、非结构化的还是它们的任何组合。本节中描述的方法是可以采用的方法,但不一定是先前已设想或采用的方法。因此,除非另有指示,否则不应当仅仅由于它们包括在本节中而假设本节中描述的任何方法是现有技术。附图说明在附图中:图1是示出未分片数据库和分片数据库之间的差异的框图;图2是数据库应用如何可以与分片数据库交互的框图;图3是其中表已经被划分成三个碎片的分片数据库系统的框图;以及图4是可以在其上实现本发明的实施例的计算机系统的框图。具体实施方式在下面的描述中,为了解释的目的,阐述了许多具体细节,以便提供对本发明的透彻理解。但是,显而易见的是,可以在没有这些具体细节的情况下实践本发明。在其它情况下,以框图形式示出众所周知的结构和设备,以便避免不必要地模糊本发明。总体概述本文描述了用于利用和扩展关系数据分片基础设施以在单个分片数据库系统中除了关系数据之外还提供对未知严格遵循任何显式定义的模式的数据项的分片的全面支持的技术。该技术采用单个后端数据库系统解决方案,而不是一个用于关系数据的分片系统和另一个用于半结构化和非结构化数据的分片系统。该技术为分片的半结构化数据提供了新的声明性模式计算能力,使得此类数据可以以更加sql友好的方式被访问。与纯rdbmssql分片解决方案不同,该技术提供了对关系数据的一般搜索索引能力,使得可以以类似于no-sql系统中使用的方式来搜索数据。另外,由于所有类型的数据都驻留在一个系统中,因此提供了声明性的双向查询转换能力,使得可以访问分片的关系数据,就好像数据是分片的半结构化数据一样,并且可以访问分片的半结构化数据,就好像数据是分片的关系数据一样。描述了其中目录服务器预先收集它需要的所有数据,以回答从动态创建的临时lob的获取的技术。此外,提供了其中目录服务器在发送给客户端的lob定位符中对碎片标识符进行编码的技术。还提供了用于将各种操作符下推到碎片服务器的技术。系统概述参考图3,其是图示分片数据库系统300的框图,分片数据库系统300被设计为将水平分区应用于存储结构化、半结构化和/或非结构化数据的容器。分片数据库系统300包括接收跨碎片查询的目录服务器302。“跨碎片查询”是指涉及已在分片数据库系统300内进行水平分区的容器的任何数据库命令。由目录服务器302接收到的跨碎片查询可以来自在分片数据库系统300内存储数据的任何类型的软件程序。发起跨碎片查询的典型软件程序包括驻留在分片数据库300外部的数据库客户端应用和数据库服务器。本文描述的技术不限于任何特定类型的数据库请求源。为了说明的目的,目录服务器从其接收跨碎片查询的源被图示为请求实体304。目录服务器302管理目录306,该目录306包含关于分片数据库系统300的拓扑的信息。具体而言,目录306指示如何对分片数据库系统300中的每个分片对象进行分片,并且对于每个分片对象的每个碎片,分片数据库服务器系统300内的哪个数据库服务器负责该碎片。分片数据库系统内的数据库服务器实例被称为碎片服务器。在所示的实施例中,分片数据库系统300具有三个碎片服务器(312、314和316),其分别属于数据库系统352、354和356。数据库系统352、354和356可以位于同一地点或在地理位置上分散。通常,属于分片数据库系统的数据库系统位于一个国家的不同区域或全球的不同国家。目录服务器302本身也可以是碎片服务器。但是,为了便于说明,将假定目录服务器302不是碎片服务器。碎片服务器(312、314和316)中的每一个都具有其自己本地的一个或多个处理器集合、其自己的易失性存储器。此外,碎片服务器312、314和316中的每一个都可以分别访问存储装置332、334和336。为了进行水平分区,分片表x的每个碎片仅被分配给其中一个碎片服务器。为了说明的目的,将假定表x的碎片1、2和3分别被分配给碎片服务器312、314和316。虽然被示为单个设备,但是存储装置332、334和336中的每一个可以包括任何数量和类型的持久性存储设备。在替代实施例中,碎片服务器312、314和316可以访问相同的共享盘。但是,即使在这样的实施例中,为了获得水平分区的益处,优选的是将所有跨碎片查询都定向到目录服务器302,目录服务器302可以基于在目录306中指示的碎片到碎片服务器映射在碎片服务器312、314和316之间划分工作。根据一些实施例,请求实体304保持与碎片服务器312、314和316中的每一个的连接,以使请求实体304能够与碎片服务器312、314和316直接交互。如将在下文中更详细解释的,这种直接交互可以在跨碎片查询的工作已经被目录服务器302划分并分发给碎片服务器312、314和316之后发生。根据一些实施例,请求实体304本身可以维护指示碎片到碎片服务器映射的数据,并利用该映射数据来智能地确定将针对分片表的查询发送到哪里。例如,假定请求实体304维护指示以下内容的数据:·碎片1被分配给碎片服务器312,并且包括其中年龄<10的所有行·碎片2被分配给碎片服务器314,并且包括其中年龄>=10和<30的所有行·碎片3被分配给碎片服务器316,并且包括其中年龄>=30的所有行假定请求实体304需要执行其中谓词为“年龄=9”的查询。基于该谓词和映射数据,请求实体304确定回答该查询所需的所有数据都在碎片1中。因此,请求实体304将直接把查询发送到碎片服务器312,因为它是被分配碎片1的碎片服务器。创建非关系数据的共享容器在常规的关系数据库系统中,数据往往以高度结构化的方式进行组织。具体而言,数据通常被存储在关系表中,其中每一行表示一组相关数据(例如,关于特定人物的信息),并且每一列对应于特定的属性(例如,姓名、地址、年龄等)。但是,使用关系表存储和访问具有较少结构的数据就不那么直接。能够存储和高效地访问结构化程度较低或完全非结构化的数据变得越来越重要。半结构化数据(诸如xml(可扩展标记语言)、json(javascript对象表示法)等)是支持无模式开发范例的主要数据模型,在这种无模式开发范例下,用户不必为了存储数据和查询数据而指定模式。由于不需要提前使用模式来存储半结构化数据,因此用户可以自由地将任何原始形式的半结构化数据存储在盘上。遗憾的是,这种自由是以性能为代价的。可以使用某些技术,诸如在题为“efficientin-memorydbqueryprocessingoveranysemi-structureddataformats”的美国专利申请no.15/162,235中描述的技术,来提高数据库服务器针对半结构化数据的操作的性能。该申请的全部内容通过引用并入本文。但是,这些技术不涉及半结构化数据的水平分区,因此没有提供水平分区带来的性能益处。根据一个实施例,为了实现半结构化数据的那些益处,扩展了由数据库服务器支持的数据库语言以使用户能够为保持半结构化数据的容器指定水平分区标准。例如,根据一个实施例,可以使用以下命令(cmd1)来创建用于存储json文档等的分片表。cmd1在cmd1中,行“createshardedtabledepartments”指示目录服务器302创建名称为“departments”的分片表。该表具有两列“departno”和“departinfo”。departno列保持“number”类型的值,并且不允许为空(即,“notnull”)。departinfo存储半结构化数据。varchar2(4000)指示从关系数据库服务器的角度来看,departinfo列将仅包含非结构化字符串。关系数据类型clod(字符大对象)和blob(二进制大对象)也可以用于存储半结构化数据。json文档通常并非完全没有结构。因此,行“check(departinfoisjson))”指示在将任何数据存储在departinfo列之前,必须进行检查以验证数据表示有效的json文档。cmd1进一步指定“departno”是用于对departments表进行水平分区的键,该分区应该通过对departno值进行散列来完成,并且分区的数量将由系统自动选择(partitionsauto)。为了创建departments表,请求实体304将cmd1发送到目录服务器302。目录服务器302确定要创建多少碎片、确定碎片到碎片服务器的映射,并且然后将命令发送到每个碎片服务器以使得创建相应的碎片。为了说明的目的,将假定目录服务器302确定应创建三个碎片(碎片1、碎片2和碎片3),并且碎片1、2和3分别被分配给碎片服务器312、314和316。目录服务器302在目录306中存储关于departments如何被分片以及碎片到碎片服务器的映射的信息。目录服务器302然后可以向碎片服务器312、314和316中的每一个发送命令,以使它们创建新departments表的它们各自的碎片。碎片到碎片服务器的映射可以是一对一或多对一的映射(例如,单个碎片服务器可以被分配多个碎片)。作为另一个第二示例,可以使用以下命令(cmd2)来创建用于存储json文档等的分片表。createshardedtablegkd_data(idnumber,docdatedate,gkgrecordidvarchar2(30),docblobcheck(docisjson))partitionbyrange("docdate")(partition"sys_zero"valueslessthan(to_date('1941-11-3000:00:00','syyyy-mm-ddhh24:mi:ss','nls_calendar=gregorian'))tablespacets1);altertablegkd_dataaddpartition"sys_one"valueslessthan(to_date('2001-11-3000:00:00','syyyy-mm-ddhh24:mi:ss','nls_calendar=gregorian'))tablespacets2;altertablegkd_dataaddpartition"sys_two"valueslessthan(to_date('2020-11-3000:00:00','syyyy-mm-ddhh24:mi:ss','nls_calendar=gregorian'))tablespacets3;altertablegkd_dataaddpartition"sys_three"valueslessthan(to_date('2025-11-3000:00:00','syyyy-mm-ddhh24:mi:ss','nls_calendar=gregorian'))tablespacets4;cmd2由cmd2创建的表(gkd_data)将以与上述关于cmd1相同的方式处理。具体而言,请求实体304将cmd2发送到目录服务器302,并且目录服务器302将分片信息存储在目录306中,并将适当的命令发送到碎片服务器312、314和316,以创建指定的gkd_data的碎片。gkd_data的列分别是id、docdate、gkgrecordid和doc,它们的数据类型分别为number、date、varchar2和blob。在这个示例中,gkgrecordid列存储半结构化数据,因此在该列上定义了检查约束,以确保存储在该列中的数据是有效的json文档。cmd2与cmd1的区别在于,cmd2中的分区是用户定义的按范围分区,而不是按散列自动分区。因此,在cmd2中,用户已指定分区的数量以及映射到每个分区的分区键范围。响应于执行cmd2,创建了gkd_data的四个碎片(sys_zero、sys_one、sys_two和sys_three)。在cmd1和cmd2两者中,分区/分片键都是目标表的实际列。但是,在替代实施例中,分区/分片键可以是从包含半结构化数据的列中提取的虚拟列。例如,与分区范围进行比较以确定应将给定行存储到的分区/碎片的“docdate”值不是在任何表定义中被显式定义,而是可以是从该给定行的gkd_data列中的半结构化数据项提取的值。当以这种方式从行的半结构化列中提取数据时,该数据被称为来自该行的“虚拟列”。为了支持虚拟列,从半结构化数据中提取目标信息的数据库服务器使用元数据,该元数据指示如何解析半结构化数据以获得目标信息。自包含的半结构化数据存储格式在分片环境中,系统通常会提供自动分片能力以实现负载平衡(与上述cmd1一样)。因此,重新分片通常涉及将表空间从一个存储设备复制到另一个存储设备。为了促进这种重新分片,在一个实施例中,存储在分片表中的半结构化数据是自包含的。xml和json文本自然地是自包含的。包括编码数据(例如,二进制xml)的项目可以通过与该项目一起保持对编码数据进行解码所需的信息而自包含。自包含的半结构化数据项,诸如自包含的文档,不依赖于目录服务器级别的任何全局字典,也不依赖于任何碎片服务器级别字典。因此,即使数据是先前从分配给不同碎片服务器的碎片迁移的,每个碎片服务器也能够独立地回答对在其分配的(一个或多个)碎片中的数据的任何查询,而无需与目录服务器或其它碎片服务器进行交互。根据一个实施例,只要解码信息以与数据结合迁移/重新分布的粒度相同的粒度级别存储,半结构化数据就可以是自包含的。例如,如果数据在行的粒度级别上进行迁移/重新分布,那么当行的解码信息与该行一起被存储和移动时,该行是自包含的。另一方面,如果数据以较大的块进行迁移/重新分布(粒度范围从几行的“切片”到分区、分区集合、表空间,或表空间集合),那么那些较大的块中的每个块包含用于在该块内的所有半结构化数据的解码信息。根据一个实施例,“块”可以包括来自多个表中的每个表的一个或多个分区。例如,假定表t1被分区为分区t1a、t1b和t1c。假定表t2被分区为分区t2a、t2b和t2c。这些分区可以被分配给三个块,其中第一块具有分区t1a和t2a,第二块具有分区t1b和t2b,并且第三块具有分区t1c和t2c。可以以这种块的粒度执行数据迁移。因此,在其中分片数据在碎片之间迁移的重新分片操作期间,分区t1a和t2a被视为不可分割的单元,因为它们属于同一块。作为自包含半结构化数据的替代方案,可以在碎片服务器级别对半结构化数据进行编码。与自包含数据相似,在碎片服务器级别编码的数据允许每个碎片服务器独立地回答针对其分配的碎片中的数据的查询,而无需涉及目录服务器或任何其它碎片服务器。碎片服务器级别编码实现了这种独立性,同时仍允许以更紧凑的二进制格式表示半结构化数据。但是,拥有碎片服务器级别字典意味着重新分片操作缓慢。例如,重新分片可能涉及合并本地特定于碎片的字典(其可能具有冲突的标识符到值的映射)。另外,将碎片服务器级别字典用于跨碎片查询往往较慢,因为每个碎片服务器都需要在查询执行时间期间生成自包含的二进制格式,使得目录服务器和客户端可以消化二进制格式而不会产生得到碎片服务器级别的本地字典的成本。在lob定位符中编码碎片标识符大对象(lob)列经常用于存储半结构化和非结构化数据。在上面给出的cmd2示例中,json“doc”项存储在blob列中。lob通常“按引用”而不是“按值”返回。即,数据库服务器不是响应于客户端的查询来返回整个lob或lob集合,而是可以返回lob定位符。lob定位符不包含非结构化数据本身,而是包含可以用于检索非结构化数据的信息的数据结构。在美国专利no.5,999,943中详细描述了lob定位符,该专利的全部内容通过引用并入本文。为了说明的目的,假定请求实体304向目录服务器302提交以下跨碎片查询(q0),以从由cmd2创建的表gkd_data的lob列中检索数据:q0:selectid,docfromgkd_data响应于从请求实体304接收到q0,目录服务器302将查询发送到每个碎片服务器312、314和316。碎片服务器312、314、316处理它们各自的查询,并将结果发送回目录服务器302。在这种情况下,“结果”可能是lob定位符集合,而不是匹配文档本身的全部内容。具体而言,由于lob列数据是经由引用处理的,因此目录服务器302仅从每个碎片服务器接收lob定位符。当请求实体304从目录服务器302取得lob定位符时,请求实体304使用lob定位符中的信息来请求目录服务器302读取并获取lob的内容。这迫使目录服务器302将lob读取请求发送回适当的碎片服务器进行处理。但是,目录服务器302可能具有从多个碎片服务器返回的lob定位符。因此,目录服务器302需要一种手段来知道向哪个碎片服务器发送任何给定的获取请求。根据一个实施例,当目录服务器302向数据库客户端提供指向分片表中的lob的任何lob定位符时,目录服务器302将“碎片标识符”编码到lob定位符中。“碎片标识符”是唯一识别最初从其提供lob定位符的碎片服务器的任何信息。碎片服务器可以与多个碎片标识符相关联(例如,可以将块id用作碎片标识符),但是任何给定的碎片标识符都仅映射到一个碎片服务器。例如,假定在q0的处理期间,碎片服务器312、314和316分别将lob定位符ll1、ll2和ll3返回到目录服务器302。当将lob定位符提供给数据库客户端(诸如请求实体304)时,目录服务器302将碎片标识符编码到每个lob定位符中。例如,假定目录服务器302使用映射到碎片服务器312的碎片标识符si1对ll1进行编码、使用映射到碎片服务器314的碎片标识符si2对ll2进行编码,并使用映射到碎片服务器316的碎片标识符si3对ll3进行编码。将碎片标识符编码到提供给客户端的lob定位符中允许客户端在执行涉及lob定位符的操作时透明地将碎片标识符提供回目录服务器302。例如,在向请求实体304提供ll1之前,目录服务器302将si1编码到ll1中。当请求实体304随后基于ll1向目录服务器302发送获取请求时,目录服务器302可以从从请求实体304接收到的信息中提取si1。然后,目录服务器302使用si1来确定应将获取操作转发到碎片服务器312,因为si1指示碎片服务器312是lob定位符ll1的原始来源。在使用块id作为碎片标识符的实施例中,目录服务器302检查存储在目录306中的分片元数据以确定识别出的块id映射到的碎片服务器。在本示例中,目录306中的分片元数据将指示由si1识别出的块映射到碎片服务器312。因此,目录服务器302将基于该lob定位符进行的获取转发到碎片服务器312。根据一个实施例,客户端可以确定是“按值”还是“按引用”返回lob。例如,可以基于诸如客户端期望返回给客户端的半结构化数据的量之类的因素来做出这种确定。例如,如果要由碎片服务器返回给客户端的半结构化数据的量低于阈值,则客户端可以请求“按值”而不是“按引用”的结果。即,返回满足查询的实际数据。在这种情况下,目录服务器302仅将数据转发给客户端,并且不需要在响应中编码任何碎片标识符。在一个实施例中,所有碎片服务器或者按值提供其结果,或者都按引用提供其结果。在替代实施例中,基于每个碎片服务器响应于查询而返回的数据量,一些碎片服务器可以按值提供结果,而其它碎片服务器可以按引用提供结果。在一个实施例中,数据库可以被扩展以支持始终“按值”返回的lob类型。当列将半结构化或非结构化数据存储在已定义为仅按值的lob的列中时,则碎片服务器始终返回实际数据,并且目录服务器无需对返回给客户端的结果中的任何碎片标识符进行编码。临时lob存储在已定义为lob数据类型的列中的项目被称为“持久性lob”。在一些情况下,存储为非lob数据类型的数据可能会聚合在一起,并被数据库系统视为lob。这种动态构造的lob被称为“临时lob”。根据一个实施例,碎片服务器创建临时lob以包含满足由目录服务器提供给它们的查询的来自分配给它们的碎片中的数据。每个碎片服务器向目录服务器传递指向它创建的临时lob的lob定位符。然后,目录服务器在将lob定位符提供给客户端之前,使用适当的碎片标识符对这些lob定位符进行编码,如上所述。遗憾的是,只要是任何给定的临时lob的元数据被动态创建为特定于会话的元数据,那么以这种方式处理临时lob就可能容易出错。另外,每次交互都可能涉及客户端使用指向由目录服务器创建的临时lob的定位符、目录服务器使用指向由每个碎片服务器创建的临时lob的定位符、碎片服务器将非结构化数据返回到目录服务器(并更新它们自己的特定于会话的临时lob元数据),以及目录服务器将非结构化数据返回给客户端(并更新其自己的特定于会话的临时lob元数据)。返回临时lob的跨碎片查询为了降低这种交互的复杂性,提供了其中碎片服务器本身不创建临时lob的实施例。而是,碎片服务器将向目录服务器“按值”返回满足跨碎片查询的数据。目录服务器将它从各个碎片服务器接收到的数据组织到单个临时lob中,并将该临时lob的定位符提供给客户端。客户端基于该lob定位符进行的所有后续请求都可以直接从存储在目录服务器处的临时lob回答,而无需进一步涉及碎片服务器或需要它们承担维护其自己的临时lob的记账开销。让碎片服务器“按值”将其结果提供给目录服务器的另一个益处是允许目录服务器应用各个碎片服务器无法应用的条件,诸如“前n个”。例如,假定跨碎片查询请求10个销售额最高的月份。在这种情况下,不是让每个碎片服务器用其销售信息创建临时lob,而是可以将销售信息提供给目录服务器。在目录服务器处从所有碎片接收到数据之后,目录服务器然后可以应用前n个过滤器。由于应用了过滤器,因此有可能将由多个碎片服务器之一提供的所有信息从由目录服务器创建的临时lob中过滤掉。根据一个实施例,为了减少由每个碎片服务器提供的信息量,目录服务器可以将“前n个”条件“下推”到每个碎片服务器。作为响应,每个碎片服务器将把“前n个”条件应用于其查询结果,并且仅将其本地前n个项目提供给目录服务器。因此,目录服务器将从每个碎片服务器接收本地前n个项目、合并并排序本地结果、找到全局前n个项目,并为这些项目创建临时lob。然后,目录服务器将向客户端返回指向其动态创建的临时lob的lob定位符。选择列表中具有json_query(…返回clob)和json_value(…返回clob)形式的查询是其中目录服务器可能创建临时lob并将指向该临时lob的lob定位符返回给请求实体的情况的示例。在一个实施例中,每个碎片服务器向目录服务器返回临时lob定位符sl,目录服务器创建其本地临时lob定位符cl。为了获得由目录服务器创建的临时lob的数据,目录服务器使用临时lob定位符sl从碎片服务器读取内容,并将内容复制到与lob定位符cl相关联的临时lob中。在读取所有必要的内容之后,目录服务器释放临时lob定位符sl,并将cl返回给请求实体。通过使用基于碎片服务器的lob定位符主动将所有数据获取到目录服务器,分配给基于碎片服务器的lob的资源可以被尽早回收,而不是作为由目录服务器创建的临时lob的垃圾收集的一部分。因此,避免了跨客户端/目录服务器/碎片服务器链的远程lob垃圾收集。具体而言,一旦碎片服务器将临时lob的lob定位符发送到目录服务器,目录服务器就会主动从临时lob中获取所有数据,然后释放碎片服务器临时lob,使得碎片服务器可以释放相应的资源。那时,所有涉及跨碎片查询的进一步交互仅在目录服务器与其数据库客户端之间进行。数据库客户端还可以主动从目录服务器的临时lob中获取所有数据,以允许尽早释放目录服务器的临时lob的资源。在一个实施例中,一直到数据库客户端都使用基于值的临时lob。因此,当目录服务器从碎片服务器得到基于值的lob时,目录服务器将复制数据、创建基于值的lob,并使得释放碎片服务器lob。然后,当数据库客户端得到由目录服务器创建的基于值的临时时,数据库客户端将复制该lob,然后释放目录服务器的临时lob,使得目录服务器可以释放由其创建的临时lob占用的资源。下推半结构化数据sql操作符跨碎片查询根据一个实施例,可以使用半结构化操作符来访问包含结构化和半结构化数据的项,虽然这些项本身位于分片关系表中。例如,可以在sql查询的where子句中使用json_exists()/xmlexists()sql操作符。作为另一个示例,可以在sql查询的选择列表和/或where子句中使用json_value()、json_query()。考虑以下两个查询:q1:selectjson_value(doc,'$.gkg."@date"'),json_query(doc,'$.gkg.themes.theme')fromgkd_data;查询q1要求从存储在分片gkd_data表的doc列中的半结构化数据项内提取“date”和“theme”属性值。q2:selectcount(*)distinctfromgkd_datawherejson_exists(doc,‘$.gkg.themes.theme’);查询q2确定分片gkd_data表的doc列中具有不同“theme”属性值的半结构化项目的数量(计数)。根据一个实施例,在此类查询的跨碎片查询编译时间期间,目录服务器识别跨碎片查询内的半结构化sql操作符,并将它们标记为“可下推”到每个碎片服务器,使得每个碎片服务器将单独评估半结构化sql操作符。例如,以下说明计划指示由目录服务器在查询q1的处理期间执行的操作:q1说明计划该q1的说明计划指示,在执行q1的select语句期间,目录服务器向每个碎片服务器(由“sharditerator”指示)发出远程sql(由“remote”指示)。发送到每个碎片服务器的远程sql命令使碎片服务器执行半结构化操作的实际执行。在本示例中,在一个实施例中,由目录服务器发送到每个碎片服务器的q1的远程sql命令的说明计划为:远程sql信息(由操作id识别):如从该说明计划可以明显看出的,各个碎片服务器执行与半结构化操作相关联的操作,并将结果返回到目录服务器,以使目录服务器能够将聚合结果呈现给提交查询q1的请求实体。作为另一个示例,以下说明计划指示由目录服务器在查询q2的处理期间执行的操作:q2说明计划与q1类似,在处理q2时,目录服务器将半结构化操作所需的操作推送到碎片服务器。但是,在q2的情况下,目录服务器必须在从碎片服务器接收结果之后和将结果提供给最初提交q2的请求实体之前对数据执行一些附加工作(sortaggregate)。例如,该附加工作可以反映要对数据进行排序,以便在countdistinct操作的情况下消除重复。与q1一样,响应于q2而发送到每个碎片服务器的远程sql命令使碎片服务器执行半结构化操作的实际执行。在本示例中,在一个实施例中,由目录服务器发送到每个碎片服务器的q2的远程sql命令的说明计划为:远程sql信息(由操作id识别):在上面给出的示例中,发送到碎片服务器的远程sql包含许多命令选项(例如,“withoutarraywrappernullonerror”),这些命令选项不在目录服务器接收的初始跨碎片查询中。在一个实施例中,目录服务器基于系统默认值将这些命令选项包含在远程sql命令中。如果目录服务器接收到的跨碎片查询包含与默认值不同的选项,则远程sql包含在该跨碎片查询中显式指定的选项。但是,对于跨碎片查询未显式覆盖的所有选项,目录服务器在发送到碎片服务器的远程sql中使默认选项显式,以避免碎片服务器使用的命令选项中出现任何偏差的机会。分片表中半结构化数据的特定于碎片的索引根据一个实施例,当目录服务器接收到对分片表建立索引的数据定义语言(ddl)命令时,目录服务器将命令推送到每个碎片服务器,以使每个碎片服务器为其分片表的相应碎片创建本地索引。以下是对包含半结构化数据的分片表创建搜索索引的命令的示例。createsearchindexjidxondepartments(departinfo)forjsonlocal;createsearchindexoidxongkd_data(doc)forjsonlocal;响应于该命令,创建通用的无模式搜索索引,从而以no-sql数据库系统中通常采用的方式搜索半结构化和非结构化数据。在一个实施例中,创建每个表分区(per-table-partition)索引,使得任何给定分区中的数据具有相应的索引。由于每个碎片服务器对于其表的相应碎片都有一个或多个本地索引,因此这些索引与表的单个全局索引相比通常将较小且争用较少。如下文将描述的,当目录服务器将跨碎片查询中的谓词推送到碎片服务器时,碎片服务器使用这些索引。如果对半结构化数据创建索引的ddl语句被发送到碎片服务器而不是目录服务器,则碎片服务器将基于其碎片内的半结构化数据创建指定的索引。就碎片服务器从目录服务器接收可以从索引中受益的远程sql而言,碎片服务器编译远程sql以利用索引,即使可能接收相同远程sql的其它碎片没有这样的索引。因此,当接收远程sql时,每个碎片服务器都编译远程sql,以利用其可用于其碎片中的半结构化数据的任何访问结构,而不管这些相同的访问结构是否可用于其它碎片中的半结构化数据。促进本地索引使用的搜索谓词下推如上所述,可以将涉及半结构化操作符的谓词下推到碎片服务器,并且碎片服务器可以使用已对其碎片中的半结构化数据构建的特定于碎片的索引来更高效地处理此类谓词。以下两个查询(q3和q4)是其中碎片服务器可以使用半结构化数据上的本地索引来更高效地处理查询的情况的示例:q3:selectcount(*)fromgkd_datawherejson_exists(doc,‘$.gkg.themes.theme’);q4:selectcount(*)fromgkd_datawherejson_textcontains(doc,'$.gkg.locations.location."@name"','dublin');在跨碎片查询编译时间期间,目录服务器将半结构化sql操作符重写到其域搜索索引操作符中,并将它们标记为可下推到每个碎片服务器,使得每个碎片服务器将使用其相应的本地域搜索索引来单独地评估半结构化sql操作符。在以下说明计划中示出了根据一个实施例的由目录服务器为处理q3所执行的操作:q3说明计划目录服务器发送给每个碎片服务器以处理查询q3的远程sql可以是,例如:重要的是,由目录服务器生成的该远程sql不会提及任何索引,因为半结构化数据上的索引是由碎片服务器创建的,而不是在目录服务器集处创建的。但是,在碎片服务器处编译远程sql时,碎片服务器会知道半结构化数据上可用的特定于碎片的索引。因此,由碎片服务器为查询q3的远程sql生成的说明计划可以是:如从该说明计划可以明显看出的,在为q3的远程查询生成其本地结果集时,每个碎片服务器都使用对其碎片内的半结构化数据构建的其特定于碎片的索引。在此说明计划中执行的用于执行域索引访问的操作可以是:远程sql信息(由操作id识别):作为碎片服务器如何可以使用对其碎片内的半结构化数据构建的本地索引来处理从目录服务器接收的远程sql的另一个示例,假定目录服务器接收到跨碎片查询q4:q4:selectcount(*)fromgkd_datawherejson_textcontains(doc,'$.gkg.locations.location."@name"','dublin');响应于从请求实体接收到q4,目录服务器可以执行以下说明计划中所示的操作:q4说明计划当目录服务器执行该说明计划时,发送给每个碎片服务器的远程sql可以是,例如:远程sql信息(由操作id识别):与前面的示例一样,该远程sql没有提及任何索引。但是,各个碎片服务器都知道其碎片的半结构化数据上特定于碎片的索引,因此这些碎片服务器可以编译远程sql以执行以下说明计划中指定的操作,这包括访问对碎片中的半结构化数据构建的域索引。可以如以下命令所示来执行该域计划中引用的索引访问:远程sql信息(由操作id识别):因此,用于对驻留在分片表中的半结构化数据创建索引的任何命令被下推到相应的碎片服务器。另外,将从这些索引的使用中受益的任何谓词也在远程sql中被下推到碎片服务器,并且由每个单独的碎片服务器基于其可用的访问结构来确定如何最佳地执行远程sql。半结构化数据的关系视图可以访问半结构化数据,就像该数据实际上按关系存储一样。按关系访问半结构化数据的一种方式是通过使用表函数,诸如json_table()和xmltable()。本文描述了用于处理使用此类表函数的跨碎片查询的技术。具体而言,根据一个实施例,在目录服务器发送给每个碎片服务器的远程sql中,将包含此类表函数的谓词下推。例如,以下两个跨碎片查询(q5和q6)包含谓词,这些谓词包括应用于半结构化数据的表函数:在此类查询的跨碎片查询编译期间,目录服务器分析查询以检测半结构化数据的表函数。跨碎片查询将表函数下推到碎片服务器,使得每个碎片服务器将单独评估表函数。由表函数生成的数据必须以后与来自主分片表的关系数据联接。例如,以下说明计划描绘了由目录服务器响应于查询q5而执行的操作:q5:说明计划目录服务器响应于q5而发送到每个碎片服务器的远程sql可以是,例如:远程sql信息(由操作id识别):如从该示例可以明显看出的,在远程sql中,jsontable命令向下传递到每个碎片服务器。在碎片服务器处,执行jsontable命令产生行源,该行源的输出是来自半结构化数据的值,这些值被组织成就好像它们是结构化关系数据一样。q6是基于存储在分片表中的半结构化数据以及访问该视图的查询(select*fromrelvu_gkd_data;)创建关系视图的示例。根据一个实施例,目录服务器通过以下两种方式响应涉及分片表中的半结构化数据的视图创建命令:(a)将视图的定义存储在目录中,以及(b)将视图创建命令传递给每个碎片服务器。每个碎片服务器都存储对应的视图定义。在存储视图定义之后,各个碎片服务器都能够处理任何引用该视图的后续查询。在本示例中,在每个碎片服务器已存储relvu_gkd_data的视图定义之后,目录服务器可以按照以下说明计划指示的方式编译查询“select*fromrelvu_gkd_data”:q6说明计划远程sql信息(由操作id识别):推送到每个碎片服务器的远程sql将整个json_table()查询从目录服务器发送到每个碎片服务器。在跨碎片查询中从半结构化数据计算关系模式“数据向导”是一组元数据,其描述添加到分层数据对象的集合中的分层数据对象的结构。分层数据对象的示例是符合xml的文档或符合json的数据对象。在2015年4月29日提交的美国专利申请no.14/699,685中详细描述了用于半结构化数据的数据向导以及用于创建和更新这种数据向导的技术,该专利的全部内容通过引用并入本文。由于半结构化数据不是完全结构化的,因此集合中项目的结构可能因项目而异。在一个实施例中,当应用于半结构化集合时,dataguide()操作符返回指示在集合中找到的每个不同属性的元数据。因此,当dataguide()操作符应用于该集合时,并非集合中的所有项目都将具有返回的所有属性。由于由dataguide()操作符返回的属性的数量可能非常大,因此用于保持dataguide操作符的结果的数据类型可以是基于字符的大对象(clob)。根据一个实施例,当目录服务器接收到引用数据向导的跨碎片查询时,数据向导操作符在远程sql中被下推到每个碎片服务器。例如,假定目录服务器接收到查询q7:q7:selectjson_dataguide(doc)fromgkd_data在查询q7中,json_dataguide()是用于从json集合(诸如存储在gkd_data表的“doc”列中的json项集合)计算关系数据向导模式的聚合函数。在跨碎片查询编译时间期间,目录服务器识别模式计算聚合函数,并将其下推到每个碎片服务器以进行计算。在跨碎片查询执行时间期间,目录服务器对从每个碎片服务器接收到的所有数据向导运行数据向导聚合方法,并对存储在所有碎片中的所有半结构化数据计算全局模式(全局“数据向导”)。以下说明计划指示目录服务器响应于查询q7而执行的操作:用于q7的说明计划:由目录服务器响应于q7而发送给每个碎片服务器的远程sql可以是,例如:在这个示例中,每个碎片服务器都从其相应的碎片中独立生成查询所针对的半结构化数据的数据向导。然后,目录服务器接收这些特定于碎片的数据向导、从特定于碎片的数据向导中解包/解析信息,并且基于该信息构造全局数据向导。在替代实施例中,发送到碎片服务器的远程命令不导致创建特定于碎片的数据向导。而是,远程命令仅请求扫描用于构造数据向导的原始半结构化信息。在从碎片服务器接收到原始信息后,目录服务器将组装全局数据向导。基于模式修剪的跨碎片查询常规的“碎片修剪”基于引用分片键的跨碎片查询谓词。例如,假定分片键为“name”,并且分片表被划分为三个碎片s1、s2和s3,其相应的范围为a-l、m-s和t-z。在这些条件下,当跨碎片查询的谓词为“wherename>“peter””时,目录服务器将检查分片元数据,以确定s1中的任何数据都无法满足该谓词。因为s1没有可以满足查询的项目,因此目录服务器仅将远程命令发送到与s2和s3相关联的碎片服务器。根据一个实施例,当谓词引用半结构化数据的属性时,目录服务器被配置为基于这样的谓词执行碎片修剪,而不管谓词是否涉及分片键。具体而言,对于半结构化数据上的跨碎片查询,目录服务器基于哪些碎片包括跨碎片查询谓词中指定的属性使用来自每个碎片服务器的计算出的数据向导对碎片进行修剪。例如,考虑跨碎片查询(q9):q9:selectcount(*)fromgkd_datawherejson_exists(doc,‘$.gkg.sparse011’);在接收到查询q9后,目录服务器使用来自每个目录服务器的数据向导确定gkg.sparse011仅在碎片s1和s3上可用。因此,在处理查询q9时,目录服务器仅将远程命令推送到与碎片s1和s3对应的碎片服务器。目录服务器可以通过响应于接收到查询q9而向每个碎片服务器发送数据向导请求来动态获得特定于碎片的数据向导。替代地,每个碎片服务器可以动态地维护持久性最新数据向导(或具有从中构造数据向导的信息的表)。在这种情况下,目录服务器可以维护与特定于碎片的数据向导保持同步的全局数据向导,或者可以查询包含特定于碎片的向导的信息的表。在替代实施例中,为了减少维护全局数据向导信息的开销,全局数据向导的同步可以不是立即的。而是,可以定期、按需或响应于特定事件来更新数据。在其中允许全局数据向导陈旧的情况下,目录服务器可以基于不是最新的数据做出修剪决定,并且查询结果可以被认为是“近似”而不是绝对准确。在一些情况下,此类近似结果可能足以满足提交跨碎片查询的目的。从分片关系数据构造半结构化数据如上所述,表函数允许将半结构化数据视为就好像它是关系数据。根据一个实施例,还提供了允许像半结构化数据一样查看和操作关系数据的技术。例如,考虑以下查询(q8):查询q8要求从关系列department_id、department_name、manager_id、location_id中提取的数据作为json_array返回,而json_array本身由两个json_arrays组成。在跨碎片查询编译时间期间,目录服务器分析此类跨碎片查询并识别半结构化构造sql操作符,诸如:·json_object(),·json_array(),·json_objectagg(),·json_arrayagg(),·xmlelement(),·xmlforest(),·xmlconcat(),·xmlagg(),·xmlcomment(),·xmlpi(),在识别出任何此类半结构化构造sql操作符后,目录服务器将它们标记为要推送到每个碎片服务器,使得每个碎片服务器将单独在本地在每个碎片服务器中评估那些函数,如以下说明计划中所示:q8说明计划:计划散列值:1229964818在本示例中,目录服务器发送到每个碎片服务器的远程sql可以是,例如:远程sql信息(由操作id识别):分片环境中用于半结构化数据的sodaapi根据一个实施例,目录服务器公开soda(简单对象数据访问)api以提供用于存储半结构化数据的集合接口,诸如json。目录服务器还支持使用qbe(按示例查询)的查询能力。通过提供qbe和sodaapi,分片系统管理的关系数据库似乎是使用sodaapi的请求实体的no-sql存储库。在一个实施例中,对sodaapi进行增强,以添加分片对象集合。具体而言,目录服务器允许用户决定对其集合进行分片,并且然后将分片的集合映射为分片表。使用利用上述技术优化的半结构化sql操作符将分片集合上的所有qbe重写为跨碎片sql查询。硬件概述根据一个实施例,本文描述的技术由一个或多个专用计算设备实现。专用计算设备可以是硬连线的以执行这些技术,或者可以包括数字电子设备(诸如永久地编程以执行这些技术的一个或多个专用集成电路(asic)或现场可编程门阵列(fpga)),或者可以包括被编程为按照固件、存储器、其它存储装置或其组合中的程序指令来执行这些技术的一个或多个通用硬件处理器。这种专用计算设备还可以将定制的硬连线逻辑、asic或fpga与定制的编程相结合,以实现这些技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或者结合硬连线和/或程序逻辑以实现这些技术的任何其它设备。例如,图4是图示可以在其上实现本发明实施例的计算机系统400的框图。计算机系统400包括总线402或用于传送信息的其它通信机制、以及与总线402耦合以处理信息的硬件处理器404。硬件处理器404可以是例如通用微处理器。计算机系统400还包括耦合到总线402的主存储器406,诸如随机存取存储器(ram)或其它动态存储设备,用于存储信息和将由处理器404执行的指令。主存储器406还可以用于在执行要由处理器404执行的指令期间存储临时变量或其它中间信息。当存储在处理器404可访问的非瞬态存储介质中时,这些指令使计算机系统400成为被定制以执行指令中指定的操作的专用机器。计算机系统400还包括耦合到总线402的只读存储器(rom)408或其它静态存储设备,用于存储用于处理器404的静态信息和指令。存储设备410(诸如磁盘、光盘或固态驱动器)被提供并被耦合到总线402,用于存储信息和指令。计算机系统400可以经由总线402耦合到显示器412(诸如阴极射线管(crt)),用于向计算机用户显示信息。包括字母数字键和其它键的输入设备414被耦合到总线402,用于将信息和命令选择传送到处理器404。另一种类型的用户输入设备是光标控件416(诸如鼠标、轨迹球或光标方向键),用于将方向信息和命令选择传送到处理器404并用于控制显示器412上的光标移动。这种输入设备通常在两个轴上具有两个自由度,第一轴(例如,x)和第二轴(例如,y),这允许设备指定平面中的位置。计算机系统400可以使用定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑(它们与计算机系统相结合,使计算机系统400成为或将计算机系统400编程为专用机器)来实现本文所述的技术。根据一个实施例,响应于处理器404执行包含在主存储器406中的一个或多个指令的一个或多个序列,计算机系统400执行本文的技术。这些指令可以从另一个存储介质(诸如存储设备410)读入到主存储器406中。包含在主存储器406中的指令序列的执行使得处理器404执行本文所述的处理步骤。在替代实施例中,可以使用硬连线的电路系统代替软件指令或与软件指令组合。如本文所使用的,术语“存储介质”是指存储使机器以特定方式操作的数据和/或指令的任何非瞬态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘、磁盘或固态驱动器,诸如存储设备410。易失性介质包括动态存储器,诸如主存储器406。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带或任何其它磁数据存储介质、cd-rom、任何其它光学数据存储介质、任何具有孔模式的物理介质、ram、prom和eprom、flash-eprom、nvram、任何其它存储器芯片或盒式磁带。存储介质不同于传输介质但可以与传输介质结合使用。传输介质参与在存储介质之间传递信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线402的导线。传输介质也可以采用声波或光波的形式,诸如在无线电波和红外数据通信期间生成的那些。各种形式的介质可以参与将一个或多个指令的一个或多个序列携带到处理器404以供执行。例如,指令最初可以在远程计算机的磁盘或固态驱动器上携带。远程计算机可以将指令加载到其动态存储器中,并使用调制解调器通过电话线发送指令。位于计算机系统400本地的调制解调器可以在电话线上接收数据并使用红外发送器将数据转换成红外信号。红外检测器可以接收红外信号中携带的数据,并且适当的电路系统可以将数据放在总线402上。总线402将数据携带到主存储器406,处理器404从主存储器406检索并执行指令。由主存储器406接收的指令可以可选地在由处理器404执行之前或之后存储在存储设备410上。计算机系统400还包括耦合到总线402的通信接口418。通信接口418提供耦合到网络链路420的双向数据通信,其中网络链路420连接到本地网络422。例如,通信接口418可以是综合业务数字网(isdn)卡、电缆调制解调器、卫星调制解调器或者提供与对应类型的电话线的数据通信连接的调制解调器。作为另一个示例,通信接口418可以是局域网(lan)卡,以提供与兼容lan的数据通信连接。还可以实现无线链路。在任何此类实现中,通信接口418都发送和接收携带表示各种类型信息的数字数据流的电信号、电磁信号或光信号。网络链路420通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路420可以通过本地网络422提供到主计算机424或到由因特网服务提供商(isp)426操作的数据设备的连接。isp426进而通过全球分组数据通信网络(现在通常称为“因特网”428)提供数据通信服务。本地网络422和因特网428都使用携带数字数据流的电信号、电磁信号或光信号。通过各种网络的信号以及网络链路420上并通过通信接口418的信号(其将数字数据携带到计算机系统400和从计算机系统400携带数字数据)是传输介质的示例形式。计算机系统400可以通过(一个或多个)网络、网络链路420和通信接口418发送消息和接收数据,包括程序代码。在因特网示例中,服务器430可以通过因特网428、isp426、本地网络422和通信接口418发送对应用程序的所请求代码。接收到的代码可以在被接收到时由处理器404执行,和/或存储在存储设备410或其它非易失性存储器中以供稍后执行。云计算本文一般地使用术语“云计算”来描述计算模型,该计算模型使得能够按需访问计算资源的共享池,计算资源诸如计算机网络、服务器、软件应用和服务,并且允许以最少的管理工作或服务提供商交互来快速提供和释放资源。云计算环境(有时称为云环境或云)可以以各种不同方式实现,以最好地适应不同要求。例如,在公共云环境中,底层计算基础设施由组织拥有,该组织使其云服务可供其它组织或公众使用。相比之下,私有云环境一般仅供单个组织使用或在单个组织内使用。社区云旨在由社区内的若干组织共享;而混合云包括通过数据和应用可移植性绑定在一起的两种或更多种类型的云(例如,私有、社区或公共)。一般而言,云计算模型使得先前可能已经由组织自己的信息技术部门提供的那些职责中的一些职责代替地作为云环境内的服务层来输送,以供消费者使用(根据云的公共/私有性质,在组织内部或外部)。取决于特定实现,由每个云服务层提供或在每个云服务层内提供的组件或特征的精确定义可以有所不同,但常见示例包括:软件即服务(saas),其中消费者使用在云基础设施上运行的软件应用,同时saas提供商管理或控制底层云基础设施和应用。平台即服务(paas),其中消费者可以使用由paas提供商支持的软件编程语言和开发工具,以开发、部署和以其它方式控制它们自己的应用,同时paas提供商管理或控制云环境的其它方面(即,运行时执行环境下的一切)。基础设施即服务(iaas),其中消费者可以部署和运行任意软件应用,和/或提供处理、存储、网络和其它基础计算资源,同时iaas提供商管理或控制底层物理云基础设施(即,操作系统层下面的一切)。数据库即服务(dbaas),其中消费者使用在云基础设施上运行的数据库服务器或数据库管理系统,同时dbaas提供商管理或控制底层云基础设施、应用和服务器(包括一个或多个数据库服务器)。在前面的说明书中,已经参考众多具体细节描述了本发明的实施例,这些细节可以从实现到实现有所变化。因而,说明书和附图应被视为说明性的而非限制性的。本发明范围的唯一和排他性指示,以及申请人意图作为本发明范围的内容,是以这种权利要求发出的具体形式从本申请发出的权利要求集合的字面和等同范围,包括任何后续更正。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1