并行执行具有递归子句的查询的制作方法

文档序号:15235233发布日期:2018-08-21 20:26阅读:165来源:国知局
本发明涉及查询的并行执行,并且更具体地涉及用于并行地使用多个进程来执行具有递归子句的查询的改进的计算机实现的技术。
背景技术
::数据库以暴露于外部实体(例如,用户和应用)的逻辑格式将数据存储为行和列。数据库中的数据通过数据库管理系统(dbms)被访问,该数据库管理系统接受标准语言(诸如sql)的“数据库查询”。该标准语言提供子句,这些子句允许用户基于可能位于特定数据库对象的具体列中的数据项来访问数据库对象(例如,表或索引)的行。数据库查询可以包括声明不同种类的操作(诸如行的聚合、联接、插入、更新或删除)的许多种类的子句。一种具体类型的子句是递归(recursive)子句。某种类型的查询是具有递归子句的查询。具有递归子句的查询需要执行多次迭代,并且来自先前迭代的结果被用于执行下一次迭代。通常,进程使用私有缓冲区高速缓存来存储先前迭代的中间结果集,以便为当前迭代执行数据库操作。当需要多个进程并行地执行查询时,私有缓冲区中的中间结果仅对为该缓冲区生成了结果的进程是可用的。因此,进程只能对该进程所缓冲的结果进行工作,而不能对由其它进程产生的结果进行工作。由于这个原因,具有递归子句的查询通常只能由单个进程执行。不幸的是,仅使用单个进程来执行具有递归子句的查询造成了查询执行中的瓶颈。本节中描述的方法是可以追求的方法,但不一定是以前已设想或追求的方法。因此,除非另有指示,否则不应当假设本节中描述的任何方法仅仅由于它们被包括在本节中而被认为是现有技术。附图说明在附图中:图1a是图示系统体系架构的示例的框图,该系统体系架构被配置为在多个段已被合并到临时表的单个段之前使用盘上游标持续时间临时表(on-diskcursordurationtemporarytable)来并行执行具有递归子句的查询;图1b是图示系统体系架构的示例的框图,该系统体系架构被配置为在多个段已被合并到临时表的单个段之后使用盘上游标持续时间临时表来并行执行具有递归子句的查询;图2是图示系统体系架构的示例的框图,该系统体系架构被配置为使用存储器中游标持续时间临时表(in-memorycursordurationtemporarytable)来并行执行具有递归子句的查询;图3是图示并行执行具有递归子句的查询的程序流程的流程图。图4a是通过一个用户与任何其它用户之间的分离程度与其它用户(例如,追随者)相关的用户的亲和度图(affinitygraph);图4b是记录单个消息的接收者将把该消息重新发送到图4a中的亲和度图中的另一个用户的可能性的表;图4c是可以用于基于图4b中的记录来计算图4a中的亲和度图的传递闭包(transitiveclosure)的示例查询;图5a是图示在使用盘上cdtt执行图4c中的示例查询的初始化分支期间图1a中的系统体系架构的系统状态的框图;图5b是图示在使用盘上cdtt执行图4c中的示例查询的初始化分支之后图1a中的系统体系架构的系统状态的框图;图5c是图示在使用盘上cdtt执行图4c中的示例查询的递归分支期间图1a中的系统体系架构的系统状态的框图;图6a是图示在完成图4c中的示例查询的第一次迭代之后图2中的系统体系架构的系统状态的框图;图6b是图示在完成图4c中的示例查询的第二次迭代之后图2中的系统体系架构的系统状态的框图;图6c是图示在完成图4c中的示例查询的第三次迭代之后图2中的系统体系架构的系统状态的框图;图7是包括图4c中的示例查询的结果的表;以及图8是图示可以用于实现本文所描述的技术的计算机系统的框图。具体实施方式在以下描述中,出于解释的目的,阐述了许多具体细节以便提供对本发明的透彻理解。但是,显而易见的是,可以在没有这些具体细节的情况下实践本发明。在其它情况下,以框图形式示出了众所周知的结构和设备,以便避免不必要地模糊本发明。总体概述本文描述了用于使用并行执行数据库操作的多个进程来执行具有递归子句的查询的技术。在数据库服务器中称为查询优化器的进程确定应该用于并行地执行查询的进程的数量。在数据库服务器中称为查询协调器的进程锁定本文称为从属进程(slaveprocess)的多个进程以并行执行查询。对于递归查询的每次迭代,从数据库对象的每个段(segment)划分出工作颗粒(granule)并将其分配给多个从属进程中的每个从属进程。多个从属进程中的每个从属进程生成作为临时表的一部分的段,或者被分配作为临时表的一部分的段。从属进程为每次给定的迭代产生一个或多个结果的集合,并将这些结果标记为与该给定的迭代相关联。当每个相应的从属进程为给定迭代产生结果集合的一部分时,该从属进程将结果集合的所述一部分追加到该相应从属进程所管理的相应段。然后,每个从属进程将对新生成的结果的引用发布或存储到对从属进程可用的一个或多个源。在下一次迭代期间,每个从属进程扫描临时表的一部分以访问来自先前迭代的数据,并且然后基于分布算法将来自所述一部分的行发送到另一个从属进程。接收这些行的从属进程为下一次迭代执行一个或多个数据库操作。在满足结束条件之后,从属进程可以针对整个临时表执行最后一组的一个或多个数据库操作。系统概述图1a、图1b和图2是图示关系数据库管理系统(rdbms)100的示例系统体系架构的框图,关系数据库管理系统(rdbms)100具有执行数据库服务器实例106、126的处理器104、122和易失性存储器(未示出)。为了图示的目的,rdbms100被示出为两个数据库服务器计算机(“节点”)102、122,这两个数据库服务器计算机(“节点”)102、122执行耦合到存储在永久存储装置(“盘”)160中的数据库162的数据库服务器实例106、126。在替代实施例中,rdbms100可以包括一个或多个数据库服务器计算机,每个数据库服务器计算机执行耦合到存储在一个或多个共享永久存储设备(例如,硬盘或闪存)上的数据库的一个或多个数据库服务器实例。例如,虽然在所示的实施例中,数据库服务器计算机102正在执行单个数据库服务器实例106,但在备选实施例中,单个数据库服务器计算机可以执行三个数据库服务器实例,其中每个数据库服务器计算机可操作地耦合到相同的(一个或多个)共享盘。数据库服务器实例106、126执行由一个或多个用户或数据库应用提交给数据库服务器计算机102、122的数据库命令。这些用户和数据库应用在本文可以被称为外部实体,以表示它们在rdbms100的内部程序和结构之外。外部实体可以通过客户端-服务器关系中的网络连接到rdbms100。每个数据库服务器实例106、126还包括进程,诸如查询优化器108、128;查询协调器110、130;以及并行执行数据库操作的一个或多个进程(“从属进程”)112、114、132、134。每个数据库服务器实例还包括被称为共享全局区域(sga)的本地存储器。查询通常由数据库服务器实例在两个阶段中处理:查询编译和查询执行。在查询编译期间,数据库服务器内的进程(例如,查询优化器108或148)接收数据库查询、解析查询并确定用于执行该查询的执行计划。执行计划可以存储在游标中并发送给查询协调器。在查询执行期间,数据库服务器内的进程(例如,查询协调器110或140)管理一组一个或多个进程(例如,从属进程112、114、132、134)以执行由查询优化器生成的查询执行计划的数据库操作。dbms可以将执行计划作为分布式操作来执行。计划操作可以被划分成工作颗粒,其中一些可以由多个从属进程或线程并行执行。从属进程可能包含一个或多个线程,并且当从属进程包含单个线程时,该从属进程可以被称为线程。线程在读取数据时可以被称为读取者线程。线程在写入数据时可以被称为写入者线程。通常,查询协调器生成工作颗粒并将工作颗粒分配给从属进程。在一些实施例中,不是查询协调器生成工作颗粒并将其分配给从属进程,而是从属进程分配其自己的工作颗粒。每个从属进程可以确定要执行的工作颗粒,并且然后指示从属进程可以执行的下一个工作颗粒。例如,当从表读取时,每个相应的从属进程可以确定第一工作颗粒包括读取表的一部分,并且第二工作颗粒包括读取表的下一部分。第一特定从属进程可以选择并执行第一工作颗粒。第一特定从属进程或另一个空闲从属进程可以选择并执行第二工作颗粒,依此类推。数据字典数据库162包括表空间(包括表空间180),这些表空间是用于存储数据库对象(例如,表、临时表、索引、日志和控制文件)的数据的文件。关于这些数据库对象的元数据通常存储在数据字典170中。数据字典是数据管理的中心部分。例如,为了让数据库服务器实例内的进程访问数据库,该进程执行以下动作:·任何进程可以访问数据字典170以在提供对特定表的访问以执行由dml语句引起的操作之前查找关于用户、模式对象和存储结构的信息。·在提供对特定表的访问之前,进程可以修改数据字典170以执行由数据定义语言(ddl)语句引起的操作。表数据结构表数据以各种物理数据结构存储在永久存储装置或易失性存储器上的一个或多个物理地址范围中,各种物理数据结构包括:a.数据块b.区段(extent)c.段(segment)表由一个或多个段组成;段由区段组成,并且区段由数据块组成。最小的表数据结构被称为数据块。数据块是数据库服务器可以请求读取和写入到存储设备(其将表数据存储在例如块模式存储设备中)的数据的原子单位。为了从存储设备中检索行,包含该行的数据块被读入到存储器中,并进一步检查该数据块以确定该行在该数据块内的位置。数据块可以被约束到离散数量的物理地址(即,离散大小)用于分页(paging)目的。数据块可以包括数据项和用于特定于数据块的信息(诸如数据块内的数据项的事务历史)的头部元数据。在优选实施例中,数据项对应于以行为主格式(row-majorformat)组织成物理列的一组逻辑连续行。例如,数据块可以包含两行数据项r1c1、r1c2、r1c3、r2c1、r2c2、r2c3以及关于离散数量的连续存储器地址中的所述数据项的元数据。表的下一个最大的数据结构被称为区段。区段包括一组连续的数据块(即,在地址空间内连续)。区段还可以包括描述区段的长度、区段中的数据块的数量、区段的结束地址或其任何组合的元数据。例如,区段可以包括两个数据块b1和b2以及将区段的长度描述为2的头部元数据。表的下一个最大数据结构可以被称为段。段的“数据”包括一组区段。段的“头部元数据”可以包括指向段的每个区段的位置的指针数据。游标游标是存储用于处理特定查询或数据库操纵语言(dml)语句的信息的数据结构。dml语句可以是只读语句、或者是指定插入、更新或以其它方式修改数据库数据的语句。游标可以包含关于查询执行计划的信息。游标可以在内部声明,使得由游标引用的数据以后可以在同一查询或dml语句的执行中被访问。在一些实施例中,即使在查询执行已经完成之后,游标也可以被在有限的时间量内被存储。如果数据库管理系统接收到相同的查询或者甚至类似的查询,则可以使用该游标来为该查询提供执行计划。元数据可以关于查询执行的统计信息而被存储在游标中。该元数据也可以用于优化类似查询的未来执行。例如,关于并行处理期间数据倾斜(dataskew)的元数据可以使得查询优化器为将来的查询选择不同的分布方法。游标持续时间临时表为了执行查询,数据库管理系统100可以创建一个或多个临时表(例如,临时表190)来存储行的一个或多个集合。例如,在接收到具有需要执行多次迭代的子句的查询之后,dbms100可以创建临时表以存储迭代的结果。对于每次附加迭代,可以处理先前迭代的结果(例如,在联接语句中),并且然后可以将附加结果追加到表。临时表在本文可以被称为游标持续时间临时表(cdtt)。一旦游标被移除,就从数据库中移除临时表。在实施例中,临时表是游标持续时间临时表,并且定义临时表的元数据保留在存储器中直到游标老化移出(ageout)为止。游标在查询执行期间保留在存储器中,并且然后保留到另一个游标需要由该游标保有的存储器为止;从而该游标老化移出。盘上cdtt用于执行递归子句的一种方法是创建盘上cdtt。对于每次迭代,管理盘上cdtt是两步过程。为了在并行执行期间将数据添加到盘上cdtt,执行查询的一组从属进程(例如,从属进程112、114、132、134)中的每个从属进程在共享盘160上创建相应的段(例如,s1、s2、...、sn)。然后,每个从属进程将定义由该相应从属进程创建的相应段的元数据保存在其相应的本地存储器中,而不是将引用发布到数据字典170。图1a是图示系统体系架构的示例的框图,该系统体系架构被配置为在多个段已被合并到临时表的单个段之前使用盘上游标持续时间临时表来并行执行具有递归子句的查询。cdtt190整体地存储在盘上,但用于cdtt的映射116、118、136、138被存储在不同从属进程的本地存储器中。在用于给定迭代的数据被加载到给定段中之后,查询协调器110或130(即,主进程)通过元数据操作将由从属进程所拥有的相应段(例如,s1、s2、...、或sn)合并到主段中(例如,s0)。图1b是图示系统体系架构的示例的框图,该系统体系架构被配置为在多个段已被合并到临时表的单个段之后使用盘上游标持续时间临时表来并行执行具有递归子句的查询。cdtt190仍然整体地存储在盘上,但是在查询协调器合并信息并将信息发送到从属进程112、114、132、134之后,用于cdtt190的映射现在被整体地存储在每个从属进程的本地存储器中。段s1-s4现在称为s0的一部分(即,s0-1、s0-2、s0-3、s0-4)。由于合并是通过元数据操作执行的,因此段的数据未移动。相反,映射116、118、136、138已经改变。每个从属进程具有从查询协调器接收到的s1-s4段信息并将它们存储在其本地存储器中。在替代实施例中,可以通过移动实际数据来执行合并。在下一次迭代期间,数据库服务器(例如,节点102)中的进程(例如,查询协调器110)为每个从属进程112、114、132、134分配cdtt190的一部分。每个相应的从属进程然后扫描并分发其分配的部分。随着从分发操作接收到数据,每个相应的从属进程针对下一次迭代对这些行执行一个或多个数据库操作。可以执行多次迭代,每次迭代的结果被合并到cddt190中直到满足结束条件。在满足结束条件之后,可以针对整个盘上cdtt190执行最后一组一个或多个数据库操作。存储器中(in-memory)cdtt对上述技术的改进是将游标持续时间临时表定义为存储器中段的聚合。因为在整个查询执行期间,每个相应的从属进程对段具有所有权亲和度,因此不需要将所有存储器中段合并到“主段”(例如,s0)中。图2是图示被配置为使用存储器中游标持续时间临时表来并行执行具有递归子句的查询的系统体系架构的示例的框图。存储器中cdtt202被创建为具有多个段s1、s2、s3、s4。每个段由相应的进程(例如,从属进程112、114、132、134)管理。在消费者-生产者(consumer-producer)方法中,临时表的特定部分本地的从属进程被分配为通过以下方式来“消费”临时表的本地部分,即,扫描该表的特定行集合并将扫描的行分发到其它从属进程以便基于正在执行的数据库操作“产生”新行。例如:·可以将从属进程112分配为基于与段s1-1或s2-1相关联的工作颗粒来扫描和分发数据,段s1-1或s2-1基于映射212而被存储在从属进程112本地。·可以将从属进程114分配为基于与段s1-1或s2-1相关联的工作颗粒来扫描和分发数据,段s1-1或s2-1基于映射212而被存储在从属进程114本地。·可以将从属进程132以分配为基于与段s3-1或s4-1相关联的工作颗粒来扫描和分发数据,段s3-1或s4-1基于映射222而被存储在从属进程132本地。·可以将从属进程112分配为基于与段s3-1或s4-1相关联的工作颗粒来扫描和分发数据,段s3-1或s4-1基于映射222而被存储在从属进程134本地。即使cdtt202被优化为存储在易失性存储器中,cdtt202也不需要整体地存储在易失性存储器中。例如,在一些情况下,cdtt202可能超过在易失性存储器中已分配给它的空间。在这种情况下,临时表可能溢出到盘160上,如图2中由cdtt202-3所示。迭代列在实施例中,具有递归子句的查询的每次迭代的结果与迭代值相关联。迭代值可以是数字、字符串或指示当前迭代的某个其它值。例如,初始迭代与迭代值0相关联。然后第二次迭代与迭代值1相关联,并且第三次迭代与迭代值2相关联,使得迭代阶段的第n次迭代与迭代值n相关联。迭代可能需要为一个或多个先前迭代所生成和存储的数据。例如,迭代n可能需要来自上一次迭代n-1、某个其它的先前迭代k或一组迭代(诸如迭代l至n-1)的数据。在实施例中,临时表的记录与相应的迭代值相关联。将数据存储在临时表中可以包括存储与迭代相关联的迭代值。在一些实施例中,将附加的迭代列添加到cdtt。迭代列为特定结果集合提供迭代的指示,因此从属进程可以在执行查询的递归分支期间从临时表中检索正确的结果。迭代列可以与一个或多个属性相关联。例如,在实施例中,迭代列是系统生成的隐藏列,其只可由dbms在内部访问。在其它实施例中,迭代列是不可见列。不可见列在被专门被查询时会暴露给外部实体,但不是通过一般的select*语句。在cdtt中与区段一起保存迭代标签区段通常是指用于存储数据库的行的连续的(即,在存储器地址空间内)数据块集合。在实施例中,区段包括头部元数据,其定义区段的长度和/或区段的最末数据块地址。因此,为了读取整个区段,进程执行对头部元数据的快速读取,并且然后继续读取区段的其余部分,直到满足由头部元数据定义的条件。在一些实施例中,附加的元数据可以存储在区段的头中。例如,可以创建区段以用于已为具有递归子句的查询创建的游标持续时间临时表。在这种情况下,区段的头可以包含附加的标签,该标签指示该区段是为什么迭代而创建的。因此,当进程读取游标持续时间临时表以从先前迭代拉取结果时,进程不需要通过读取cdtt中的每个块来执行“全表扫描”。相反,进程读取每个区段的头,并确定该区段是否是由先前迭代创建的。不是由先前迭代创建的区段不被读取。只有来自存储与特定迭代相关的信息的区段中的块才可以被读取。由于区段头被读取而不是每个区段中的所有块都被读取,因此该过程在本文中可以被称为“区段修剪(pruning)”。触发cdtt的具有递归子句的查询在实施例中,数据库服务器实例被配置为接收具有递归子句的查询、解析所述查询、并基于所述经解析的查询生成涉及cdtt的执行计划。触发生成cdtt的、可以包括的递归子句的查询的两个示例是“连接(connectby)”查询和“递归(recursivewith)”查询。例如,selectfid,tid,leveliters,sys_connect_path(fid,‘/’)pathfromtedges_twstartwithfid<tidconnectbypriortid=fidandfid<tid;在这个查询中,可以在connectby语句中看见递归子句。为了获得当前迭代的结果,进程在先前迭代中的结果的“tid”列中的数据项与来自表tedges_tw的“fid”列的数据项之间执行联接。“递归”查询具有引用自身的with子句。如本文所使用的,with子句是ansisql中的数据库语句,其为子查询提供别名(alias)。例如,如果查询包括多次特定子查询,则用户可以定义包括子查询的with子句。然后,查询可以引用该with子句,而不是多次重复子查询的内容。“递归”查询具有引用其自身的with子句。在实施例中,包括递归with子句的查询的执行计划可以为with子句定义和创建临时表。包括with子句的计划操作可以引用临时表,诸如cdtt190或cdtt202。并行执行概述图3是图示并行执行具有递归子句的查询的程序流程300的流程图。在步骤302处,数据库管理系统接收具有递归子句的查询。查询优化器然后生成查询执行计划。查询执行计划可以包括用于执行查询的优化数量的从属进程。根据数据库管理系统如何被配置以及可用的系统资源,可以从现有池中拉取这些从属进程。在一些实施例中,如果从属进程池低,则可以自发地产生新的从属进程。在步骤304处,数据库管理系统生成具有一个或多个段的临时表,每个相应段与相应的从属进程相关联。在步骤306处,查询协调器将工作颗粒分配给从属进程以执行递归子句的第一次迭代并指示结果与第一次迭代相关联。在实施例中,执行第一次迭代所需的数据库操作由对游标持续时间临时表的段具有所有权的多个从属进程并行执行。第一次迭代的结果被存储在步骤306处生成的临时表中,其中每个从属进程将由该从属进程生成的相应结果存储在与该从属进程相关联的相应段中。在步骤307处,由于执行可能在第一次迭代(即,初始化分支)被执行之后立即停止,因此应用停止条件测试。在步骤308处,同一从属进程被锁定,以基于将先前迭代生成的结果集合与先前迭代相关联的指示,从在步骤304处生成的临时表中检索从先前迭代生成的结果集合。在步骤308中,查询协调器划分临时表中的数据并分发要由每个从属进程执行的工作颗粒。在实施例中,每个从属进程通过仅读取具有如下指示(即,给定区段托管从先前迭代中生成的信息)的区段来并行地执行“区段修剪”。在替代实施例中,执行整体的表扫描并且每个从属进程并行地读取临时表的一部分。在步骤310处,从属进程然后并行地执行递归子句的附加迭代并且指示结果与该附加迭代相关联。在步骤312处,附加迭代的结果被存储在步骤304处生成的临时表中,其中每个从属进程将由该从属进程生成的相应结果存储在由该从属进程管理的相应段中。在步骤314处,查询协调器审查在步骤310处生成的结果,以确定递归子句的查询执行是否完成。示例结束条件是是否没有为迭代生成结果。另一个示例结束条件是是否达到最大迭代次数。如果没有满足结束条件,则该过程从步骤308开始重复。如果已经找到结束条件,则流程继续到步骤316。在步骤316处,数据库管理系统生成最终结果集合。生成最终结果集合可以包括对从查询的先前部分生成的结果进行聚合。生成最终结果集合还可以包括对从查询的先前部分生成的结果执行最后一组数据库操作。这些数据库操作也可以并行执行。示例用例—图问题具有递归子句的查询在处理分层关系和图关系时非常有用。例如,一组实体可以通过“边”彼此相关,并且可以通过连接两个实体的边的数量来计算这两个实体之间的分离程度。每条边可以与成本相关联。一般被称为旅行销售员问题的问题是计算通过多个中间实体在两个实体之间旅行的最小成本。处理关系中另一个有趣的问题是传递闭包。非正式地,一组实体的传递闭包是可以从任何起始实体访问的所有实体的集合。解决传递闭包涉及确定特定实体的第一度关系,并且然后根据先前确定中得到的结果来确定下一度关系。当已确定第n度关系并且不存在附加关系时,问题得以解决。传递闭包可以用于对从起始机场到其它机场的旅行进行建模。传递闭包也可以用于对以下进行建模,即,消息如何被发送到一群追随者,并且自此同一消息被这些追随者重新发送他们的追随者,并且依此类推到第n度。实现示例图4a是通过一个用户与任何其它用户之间的分离程度与其它用户(例如,追随者)相关的用户的亲和度图。在图4a中,每个实体由用户标识“uid”整数表示,并且实体之间的关系由两个有向箭头表示。成本显示在每个箭头的头部旁边,表示在接收到来自另一个用户的特定消息之后该特定消息将被重新发送的概率。发送初始消息的成本始终为1,因为存在百分之百的机会初始消息会被发送。记录可以被存储在亲和度图400中呈现的每个关系的数据库中。例如,图4b是记录的表,这些记录跟踪亲和度图4a中单个消息将从特定“uid”重新发送到特定“uid”的概率。表450包括指代消息所来自的用户的用户标识符的“fid”列、指代消息发送到的用户的用户标识符的“tid”列、以及指代在接收到特定消息之后该特定消息将被重新发送的概率的“成本”列。表450可以是表182中的许多表中的一个。在以上示例中,消息可以被发送给特定用户的一组一个或多个追随者。然后,消息被重新发送给这些追随者的追随者,最后消息被发送给第二度追随者的追随者。我们可以使用具有递归子句的查询来解决uid为1-12的实体集合的传递闭包。查询应该遍历表450中描述的边,以确定第一度关系、第二度关系,以此类推。图4c是可以用于基于图4b中的记录来计算图4a中的亲和度图的传递闭包的示例查询。查询460可以分成三个分支。每个分支的执行可以串行执行,但是可以使用多个从属进程来并行执行任何特定分支所需的数据库操作。初始化分支462用于在cdtt中创建第一次迭代的结果。递归分支464然后用于使用来自先前迭代的记录来生成附加迭代,以生成每个当前迭代的结果。一旦递归分支464所需的数据库操作由于满足结束条件而停止,则可以针对对初始化分支462和递归分支464的unionall所生成的整个临时表来执行最终化分支466所需的数据库操作。查询编译数据库服务器实例(例如,db服务器实例106)可以接收如图4c所示的查询460,查询460遍历由表450表示的图并输出图中实体之间的路径。基于查询460的子句,查询优化器(例如,查询优化器108)生成用于执行查询的执行计划。确定执行计划可能需要基于例如数据库统计信息来确定多个不同执行计划中的最优执行计划。这些统计信息用于基于关于针对其执行操作的数据项在(一个或多个)表中的分布的度量以及执行与正被执行的操作类似或相同的先前操作的成本,来估计执行执行计划中的每个数据库操作的成本。一些数据库操作必须在其它数据库操作之前发生。例如,初始化分支462所需的数据库操作必须在递归分支464所需的数据库操作之前执行。但是,在其它情况下,不需要保持查询中接收到的数据库操作的顺序。有效的查询编译涉及确定第一数据库操作可以在第二数据库操作之前执行,这显著地减少了获得结果所需的工作。例如,查询460中的递归分支464包括两个谓词r.tid=t.fidandt.fid<t.tid。数据库管理系统可以通过执行更有可能首先删除大多数结果的谓词来降低执行两个谓词的估计成本。例如,如果r.tid=t.fid可能过滤掉90%的结果,并且t.fid<t.tid只可能过滤掉50%的结果,则首先执行r.tid=t.fid可以节省显著的计算成本。通过应用优化技术(诸如上述区段修剪)可以节省附加成本。在查询编译期间做出的附加确定是查询地可能的并行度。并行性是提高sql语句性能的有效方法。在语句的并行执行期间,执行计划中的每个sql操作被分成工作颗粒,每个工作颗粒被分配给不同的从属进程(例如,从属进程112、114、132、134)。为了避免倾斜,通常存在比从属进程的数量多得多的颗粒。因此颗粒和从属进程通常不是一对一的映射。通常基于优化器选择的颗粒分布方法(例如,散列、范围、行-id范围分布)按照表中的数据项对工作颗粒进行划分。由执行一个操作的一组从属进程产生的数据被分发给执行计划中的下一个操作的该组进程。分配给sql操作的进程的数量被称为并行度(dop)。dop并行性可以基于给定系统资源的可用从属进程的数量以及执行可以串行与并行地并行化的数据库操作的成本来确定。从属进程锁定在实施例中,一旦dop被确定,从属进程就被锁定而不被其它系统资源使用,直到完成查询执行。在实施例中,至少对整个递归分支(例如,分支464)发生锁定。在优选实施例中,从属进程在查询(例如,查询460)执行期间被锁定。在没有该技术的情况下,查询协调器(例如,查询协调器110)可以请求多个从属进程,并且如果没有实现锁定步骤,那么一个或多个从属进程一旦被当前查询协调器(例如,查询协调器110)释放,就可以被另一个查询协调器(例如,查询协调器130)获取。此外,通过锁定从属进程,cdtt中每个从属进程管理的数据都不会被转储(dump)用于其它任务。每个从属进程都已被分配为管理cdtt的相应段,因此失去从属进程将需要把由该从属进程管理的段重新分配给新的从属进程。此外,请求从属进程和释放从属进程的过程具有特定的计算成本。通过使用锁定技术,该成本从迭代次数的倍数减少到单次成本。并行执行具有子查询的递归cdtt是由多个从属进程生成的。cdtt的每个段由已经被分配用于执行查询的多个从属进程中的相应从属进程管理。当从属进程为给定迭代产生结果集合的相应一部分时,该从属进程将结果集合的所述相应一部分追加到该从属进程管理的相应段。因此,工作颗粒的并行结果集合以去中心化的方式存储。初始化分支执行一次以产生第一迭代结果集合。执行初始化分支可以包括将数据从初始表(例如,表450)加载到要在后续阶段的执行期间使用的一个或多个缓冲区(未示出)中。在本示例中,由部分462指示的查询460的初始化分支包括扫描表450、选择其中“fid”小于“tid”的行、并将结果存储在临时表中。该谓词将结果限制为亲和度图400中仅“前向(forward)”关系。执行递归分支包括一个或多个重复操作。这些重复操作可以在特定次数的迭代之后结束或当达到特定的结束条件时结束。递归分支执行的重复次数可能直到递归分支的执行完成时才被确定。在示例查询460中,递归分支464包括重复select语句并将每次迭代的结果存储在初始化分支462执行期间所生成的临时表中。在迭代结束时,查询协调器(例如,查询协调器110)检查任何退出条件以确定是执行另一次迭代还是继续执行最终化分支。在本示例中,当r.tid=t.fidandt.fid<t.tid返回至少一个结果时,递归分支464重复。第一个条件r.tid=t.fid是查询的“递归部分”,它将结果限制为先前可能已接收到消息的用户标识。第二个条件t.fid<t.tid将结果限制为如亲和度图400中所示的仅前向关系。使用盘上cdtt并行执行的示例查询执行由查询协调器(例如,查询协调器110)将查询所需的工作划分为“工作颗粒”来执行。从属进程(例如,从属进程112、114、132、134)然后使用工作颗粒作为指令以针对数据库的部分执行数据库操作。图5a是图示在使用盘上cdtt190针对表450执行示例查询460的初始化分支462期间图1a中的系统体系架构的系统状态的框图。在初始化分支462执行期间的系统状态包括分配给多个从属进程的工作颗粒。在这个示例中,·工作颗粒502包括针对表450的“fid”数据项1-3执行初始化分支所需的数据库操作;工作颗粒502被分配给从属进程112。·工作颗粒504包括针对表450的“fid”数据项4-6执行初始化分支所需的数据库操作;工作颗粒504被分配给从属进程114。·工作颗粒506包括针对表450的“fid”数据项7-9执行初始化分支所需的数据库操作;工作颗粒506被分配给从属进程132。·工作颗粒508包括针对表450的“fid”数据项10-12执行初始化分支所需的数据库操作;工作颗粒508被分配给从属进程134。在执行初始化分支462期间,通过执行工作颗粒502-508来创建三个区段(即,区段522、526、528)。·从属进程112在段s1中创建区段522并将s1映射116保持在本地存储器中。·从属进程132在段s3中创建区段526并将s3映射136保持在本地存储器中。·从属进程134在段s4中创建区段528并将s4映射138保持在本地存储器中。每个区段522、526、528的每条记录包括迭代编号0。为了清楚起见,未示出“path(路径)”列。在每个从属进程为第一次迭代产生结果集合之后,查询协调器110在元数据操作中将这些结果合并到单个段s0中。图5b是图示在使用盘上cdtt190针对表450执行示例查询460的初始化分支462之后图1a中的系统体系架构的系统状态的框图。在查询协调器110合并信息并将信息发送到从属进程112、114、132、134之后,映射引用所有属于单个段s0的区段。段s0被描绘为单个逻辑表以表示初始化分支462的中间结果集合。在完成初始化分支之后,数据库管理系统100检查结束条件。如果满足结束条件,则不执行递归分支464,并且查询协调器继续执行最终分支。在这个示例中,结束条件是在完成初始化分支之后没有结果。由于该条件未被满足,因此数据库系统100开始执行递归分支464。图5c是图示在使用盘上cdtt190针对表450执行示例查询460的递归分支464期间图1a中的系统体系架构的系统状态的框图。数据库服务器(例如,查询协调器110)的进程将查询460的递归分支464所需的工作划分成工作颗粒552、554、556、558。从属进程(例如,从属进程112、114、132、134)然后使用这些工作颗粒作为指令以针对数据库的部分和s0下cdtt190中的中间结果执行数据库操作。在递归分支464执行期间的系统状态包括分配给多个从属进程的工作颗粒。·工作颗粒552包括针对表450的“fid”数据项2-4执行递归分支464所需的数据库操作;工作颗粒532被分配给从属进程112。·工作颗粒554包括针对表450的“fid”数据项5-7执行初始化分支464所需的数据库操作;工作颗粒534被分配给从属进程114。·工作颗粒556包括针对表450的“fid”数据项8-10执行递归分支464所需的数据库操作;工作颗粒536被分配给从属进程132。·工作颗粒558包括针对表450的“fid”数据项11-12执行递归分支464所需的数据库操作;工作颗粒538被分配给从属进程134。在执行递归分支464期间,在执行工作颗粒552-558之后创建四个区段(即,区段542、544、546、548)。·从属进程112在段s1中创建区段542并将s1映射116保持在本地存储器中。·从属进程114在段s2中创建区段544并将s2映射118保持在本地存储器中。·从属进程132在段s3中创建区段546并将s3映射136保持在本地存储器中。·从属进程134在段s4中创建区段548并将s4映射138保持在本地存储器中。在每个从属进程为第二次迭代产生结果集合之后,查询协调器110在元数据操作中将这些结果合并到单个段s0中。这将产生类似于图5b的系统状态,但是在cdtt190的s0中的描绘中具有更多的结果。该过程继续进行尽可能多的迭代直到达到结束条件。在这个特定用例中,结束条件是在特定迭代中没有接收到任何结果行。使用存储器中cdtt并行执行的示例在使用存储器中cdtt的并行执行中,由多个从属进程生成存储器中cdtt。cdtt的每个段由已经被分配用于执行查询的多个从属进程的相应从属进程管理。当从属进程为给定迭代产生结果集合的相应一部分时,该从属进程将结果集合的所述相应一部分追加到从属进程管理的相应段。因此,工作颗粒的并行结果集合以去中心化的方式存储。图6a是图示被配置为在针对表450的示例查询460的初始化分支462执行完成之后并行执行具有递归子句的查询的系统体系架构的系统状态的框图。在执行初始化分支462之后的系统状态包括分配给多个从属进程的工作颗粒。在这个示例中,·工作颗粒602包括针对表450的“fid”数据项1-3执行初始化分支所需的数据库操作,工作颗粒602被分配给从属进程112。·工作颗粒604包括针对表450的“fid”数据项4-6执行初始化分支所需的数据库操作,工作颗粒604被分配给从属进程114。·工作颗粒606包括针对表350的“fid”数据项7-9执行初始化分支所需的数据库操作,工作颗粒606被分配给从属进程132。·工作颗粒608包括针对表350的“fid”数据项10-12执行初始化分支所需的数据库操作,工作颗粒608被分配给从属进程134。在执行初始化分支462之后的系统状态还包括cdtt202的段s1、s2、s3和s4以及其中包含的记录。在这个示例中,在执行工作颗粒602-608之后仅创建三个区段(即,区段622、626、628)。·从属进程112在段s1中创建区段622并发布对本地映射212的引用。·从属进程132在段s3中创建区段626并发布对本地映射222的引用。·从属进程134在段s4中创建区段628并发布对本地映射222的引用。每个区段622、626、628的每条记录包括迭代编号0。为了清楚起见,未示出“path(路径)”列。此外,为了清楚起见,未示出与每个相应区段相关联的迭代标签。但是,迭代标签“0”可以与指示第一次迭代的每个区段622、626、628相关联。这个标签可以在以后的迭代中用于区段修剪。在完成初始化分支之后,数据库管理系统100检查结束条件。如果满足结束条件,则不执行递归分支464,并且查询协调器继续执行最终分支。在这个示例中,结束条件是在完成初始化分支之后没有结果。由于该条件未被满足,因此数据库系统100开始执行递归分支464。数据库服务器的一个或多个进程(例如,查询协调器110或从属进程112、114、132、134自身)将查询460的递归分支464所需的工作划分成工作颗粒。从属进程(例如,从属进程112、114、132、134)然后使用这些工作颗粒作为指令以针对数据库的部分和cdtt202中的中间结果执行数据库操作。因为每个从属进程仅具有对其本地映射和数据(例如,映射212或222)的直接访问,因此从属进程扫描本地可用的数据,并使用分布算法将所扫描的数据跨从属进程的集合分布。接收该数据的从属进程然后执行查询的该特定部分所需的数据库操作。例如,从属进程112和114可以执行涉及对cdtt202-1中的段s1的区段622进行扫描的工作颗粒。这可能涉及执行区段修剪。来自区段s1的数据然后可以分发给从属进程112、114、132、134中的一个或多个。类似地,从属进程132和134可以执行涉及对cdtt202-2中的段s3的区段626和段s4的区段628进行扫描的工作颗粒。来自这些段的数据然后可以被分发给从属进程112、114、132、134中的一个或多个。图6b是图示被配置为在完成示例查询460的with子句中的第二次迭代之后并行执行具有递归子句的查询的系统体系架构的系统状态的框图。在执行第二次迭代(递归分支464的第一次迭代)之后的系统状态620包括分配给多个从属进程的工作颗粒和cdtt的段以及包含在其中的记录。在这个示例中,·工作颗粒632包括针对表450的“fid”数据项2-4执行初始化分支所需的数据库操作,工作颗粒632被分配给了从属进程112。·工作颗粒634包括针对表450的“fid”数据项5-7执行初始化分支所需的数据库操作,工作颗粒634被分配给了从属进程114。·工作颗粒636包括针对表450的“fid”数据项8-10执行初始化分支所需的数据库操作,工作颗粒636被分配给了从属进程132。·工作颗粒638包括针对表450的“fid”数据项11-12执行初始化分支所需的数据库操作,工作颗粒638被分配给了从属进程134。在这个示例中,基于相应的工作颗粒632-638创建了四个区段(即,区段642、644、646、648)。每个从属进程将其生成的相应区段追加到其管理的相应段。例如:·从属进程112将区段642追加到段s1并发布对本地映射212的引用。·从属进程114将区段644追加到段s2并发布对本地映射212的引用。·从属进程132将区段646追加到段s3并发布对本地映射222的引用。·从属进程134将区段648追加到段s4并发布对本地映射222的引用。每个区段642-648的每条记录在“iter(迭代)”列中包括迭代编号1。为了清楚起见,未示出“path(路径)”列。此外,为了清楚起见,未示出与每个相应区段相关联的迭代标签。但是,迭代标签“1”可以与指示第二次迭代的每个区段642-648相关联。使用存储器中cdtt溢出到盘上的示例在一些实施例中,cdtt202不需要整体地位于一个或多个易失性存储器中。如前所述,在一些实施例中,在每个节点(例如,节点102、122)的易失性存储器中分配给的cdtt的空间可能是有限的,因此cdtt可能“溢出”到盘上。因此,cdtt可以部分地在一个或多个节点的存储器中并且部分地在盘上。图6c是图示在完成图4c中的示例查询的第三次迭代之后系统体系架构的系统状态的框图。在本示例中,·与cdtt202-3在图2中的呈现类似,区段662存储在盘160上;本地映射212提供对区段662的引用,因此从属进程112、114可以访问盘160上的该数据。·与cdtt202-1在图2中的呈现类似,区段622、642、644和664存储在节点102的易失性存储器中;本地映射212提供对这些区段的引用,因此从属进程112、114可以访问sga210中的该数据;以及·与cdtt202-2在图2中的呈现类似,区段626、646、628、648和668存储在节点122的易失性存储器中;本地映射222提供对这些区段的引用,因此从属进程132、134可以访问sga220中的该数据;每个相应的从属进程针对相应从属进程所管理的相应段发布到区段的位置的映射。在对cdtt的每次读取中,从属进程访问其本地映射,以确定在cdtt中哪里读取区段。每个从属进程从cdtt读取相应的一组数据,并将读取的数据发送到对该数据执行工作所需的相应从属进程。在这个过程中可以发生区段修剪。并行执行最终分支最终化分支的执行可以包括对存储在临时表中的记录执行附加数据库操作并输出一个或多个结果的集合。在本示例中,执行最终化分支466包括按照“fid”、“tid”、“iters(迭代)”和“path(路径)”列来选择临时表的所有行并输出结果。图7是图示在完成执行最终化分支之后的示例查询460的结果的示例表。注意的是,“path(路径)”列中的数据项描述消息可能采用的通过亲和度图400的路径。通过在初始化分支中将每个结果记录的成本分配为1并通过将每次附加迭代的“成本”列中的数据项相乘,更高级的查询可以容易地用于显示沿着所述路径向下行进的消息的概率。虽然使用递归with描述了本示例,但是本文描述的技术可以与其它递归操作(诸如频繁的项目集合和连接)一起使用,或者由请求其它数据库操作生成的结果的非迭代操作来使用。使游标老化移出和释放从属进程在查询处理之后,从属进程可以被释放,并且定义cdtt的信息可以被覆写。(本地或者盘上的)存储器可以被解除分配,使得自由空间可用于将来的查询。取决于dbms是如何结构化的,最终化分支的结果可以作为表被持久化以用于将来的查询。硬件概述根据一个实施例,本文描述的技术由一个或多个专用计算设备实现。专用计算设备可以是硬连线的以执行所述技术,或者可以包括诸如被永久性地编程以执行所述技术的一个或多个专用集成电路(asic)或现场可编程门阵列(fpga)的数字电子设备,或者可以包括编程为按照固件、存储器、其它存储装置或者其组合中的程序指令执行所述技术的一个或多个通用硬件处理器。这种专用计算设备还可以合并定制的硬连线逻辑、asic或fpga与定制的编程来实现所述技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或者结合硬连线和/或程序逻辑来实现所述技术的任何其它设备。例如,图8是图示本发明的实施例可以在其上实现的计算机系统800的框图。计算机系统800包括总线802或者用于传送信息的其它通信机制,以及与总线802耦合用于处理信息的硬件处理器804。硬件处理器804可以是例如通用微处理器。计算机系统800还包括耦合到总线802用于存储信息和要由处理器804执行的指令的主存储器806,诸如随机存取存储器(ram)或其它动态存储设备。主存储器806还可以用于在要由处理器804执行的指令执行期间存储临时变量或其它中间信息。当存储在处理器804可访问的非瞬态存储介质中时,这种指令使计算机系统800变成为执行指令中所规定的操作而定制的专用机器。计算机系统800还包括只读存储器(rom)808或者耦合到总线802的其它静态存储设备,用于为处理器804存储静态信息和指令。提供了存储设备810,诸如磁盘、光盘或固态驱动器,并且耦合到总线802,用于存储信息和指令。计算机系统800可以经总线802耦合到显示器812,诸如阴极射线管(crt),用于向计算机用户显示信息。输入设备814(包括字母数字和其它键)耦合到总线802,用于向处理器804传送信息和命令选择。另一种类型的用户输入设备是游标控件816,诸如鼠标、轨迹球或者游标方向键,用于向处理器804传送方向信息和命令选择并且用于控制显示器812上的游标运动。这种输入设备通常具有在两个轴(第一个轴(例如,x)和第二个轴(例如,y))中的两个自由度,这允许设备在平面内规定位置。计算机系统800可以利用定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑来实现本文所述的技术,这些与计算机系统相结合,使计算机系统800或者把计算机系统800编程为专用机器。根据本发明的一种实施例,本文的技术由计算机系统800响应于执行包含在主存储器806中的一条或多条指令的一个或多个序列的处理器804而执行。这种指令可以从另一存储介质,诸如存储设备810,读到主存储器806中。包含在主存储器806中的指令序列的执行使处理器804执行本文所述的过程步骤。在备选实施例中,硬连线的电路系统可以代替软件指令或者与其结合使用。如在本文所使用的,术语“存储介质”是指存储使机器以特定方式操作的数据和/或指令的任何非瞬态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘、磁盘或固态驱动器,诸如存储设备810。易失性介质包括动态存储器,诸如主存储器806。存储介质的常见形式包括,例如,软盘、柔性盘、硬盘、固态驱动器、磁带,或者任何其它磁性数据存储介质,cd-rom,任何其它光学数据存储介质,任何具有孔模式的物理介质,ram、prom和eprom、flash-eprom、nvram,任何其它存储器芯片或盒式磁带。存储介质与传输介质不同但是可以与其结合使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线802的配线。传输介质还可以采取声或光波的形式,诸如在无线电波和红外线数据通信中产生的那些。各种形式的介质可以参与把一条或多条指令的一个或多个序列携带到处理器804供执行。例如,指令初始地可以在远端计算机的磁盘或固态驱动器上携带。远端计算机可以把指令加载到其动态存储器中并且利用调制解调器经电话线发送指令。位于计算机系统800本地的调制解调器可以在电话线上接收数据并且使用红外线发送器把数据转换成红外线信号。红外线检测器可以接收在红外线信号中携带的数据并且适当的电路系统可以把数据放在总线802上。总线802把数据携带到主存储器806,处理器804从该主存储器806检索并执行指令。由主存储器806接收的指令可以可选地在被处理器804执行之前或之后存储在存储设备810上。计算机系统800还包括耦合到总线802的通信接口818。通信接口818提供耦合到网络链路820的双向数据通信,其中网络链路820连接到本地网络822。例如,通信接口818可以是综合业务数字网络(isdn)卡、电缆调制解调器、卫星调制解调器,或者提供到对应类型的电话线的数据通信连接的调制解调器。作为另一个示例,通信接口818可以是提供到兼容的局域网(lan)的数据通信连接的lan卡。无线链路也可以实现。在任何此类实现中,通信接口818都发送和接收携带表示各种类型信息的数字信号流的电、电磁或光信号。网络链路820通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路820可以通过本地网络822提供到主计算机824或者到由互联网服务提供商(isp)826操作的数据设备的连接。isp826继而通过现在通常称为“互联网”828的全局分组数据通信网络提供数据通信服务。本地网络822和互联网828都使用携带数字数据流的电、电磁或光信号。通过各种网络的信号以及在网络链路820上并通过通信接口818的信号是传输介质的示例形式,其中信号把数字数据带到计算机系统800或者携带来自计算机系统800的数字数据。计算机系统800可以通过(一个或多个)网络、网络链路820和通信接口818发送消息和接收数据,包括程序代码。在互联网示例中,服务器830可以通过互联网828、isp826、本地网络822和通信接口818发送对应于程序的所请求代码。接收到的代码可以在其被接收到时由处理器804执行,和/或存储在存储设备810或其它非易失性存储装置中,用于以后执行。在前面的说明书中,本发明的实施例已经参考众多的具体细节进行了描述,这些细节可以因实现方案而异。因此,说明书和附图被认为是说明性的而不是限制性的。本发明的范围的唯一且排他指示,以及申请人所预期的作为本发明的范围的内容,是从本申请产生的权利要求集合的书面和等效范围,这是以这种权利要求产生的具体形式,包括任何后续的校正。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1