具体实施方式
图2描绘根据本发明一个实践的独立于数据模型或纲要而支持OLTP和OLAP活动的数字数据处理系统和环境。这可包含(例如)在支持若干数据模型(例如关系或分层数据模型)中的任一个及其伴随的查询语言的数据库系统的存储层中存留和检索数据,但这是独立于那些模型和语言的。
在所说明的实施例中,所述系统包含数字数据处理器20到40,其可为个人计算机、工作站、大型机或此项技术中已知的执行应用程序、程序和/或进程的类型的其它数字数据处理设备。尽管此处展示三个数字数据处理器20到40,但所属领域的技术人员将了解,归于此处的数字数据处理器的功能性可组合到较少数目的此类数字数据处理器上,或分布到较大数目上,所有这些都与其教示一致。所说明的数字数据处理器20到40经耦合以用于以此项技术中已知的常规方式(此处例如经由网络70,例如因特网、局域网(LAN)、广域网(WAN)或其它,其可为公共的、私人的、基于IP的等)进行通信。
所说明的数字数据处理器20包括个人计算机、工作站、大型机或其它数字数据处理设备,如上文所论述,且由开发人员用以根据本发明教示建立、测试和部署数据库系统。为此,数字数据处理器20执行用于创建此系统的多种应用程序,包含(例如)计算机语言编译器。
所说明的数字数据处理器30包括个人计算机、工作站、大型机或其它数字数据处理设备,如上文所论述,且由开发人员用以存留和/或从数据库系统(且更明确地说,例如从数据存储库50)检索信息。为此,数字数据处理器30提供接口32(例如,图形、文本、以批量为定向或其它),其接受针对数据存储和检索的用户请求,且更具体地说,例如对在数据库系统中创建、阅读、更新和删除数据的请求,且接口32产生此项技术中常规已知类型的对应通知、数据记录或其它信息,如根据本发明教示所调适。在典型应用中,相对于关系或分层数据模型或纲要,且更一般地说,相对于在其周围用户发觉数据库系统将被组织的数据模型或纲要,来作出用户的请求和由接口32产生的信息。因此,数字数据处理器30可执行任何种类的常规数据库应用程序,包含(例如)关系数据库,全部如根据本发明教示而调适。
所说明的数字数据处理器40包括个人计算机、工作站、大型机、服务器或其它数字数据处理设备,其根据本发明的教示执行数字数据信息存储和检索应用程序(例如,数据库服务器),所述应用程序存储、检索、更新、删除以及以其它方式管理维持在连网的所附接存储装置50上的数据,存储装置50可为此项技术中已知类型的硬盘驱动器和/或其它持久存储装置。数字数据处理器40和数据存储库50以此项技术中已知的常规方式操作(如根据本发明教示所调适),以使用此项技术中迄今为止未知的存储和存取模型来存留和检索数据。
图3描绘用于数据库服务器40的软件架构。如图中所示,数据库服务器40包含数据库管理软件(标记为“数据库”),其包含用户接口功能性、语言接口功能性、纲要定义功能性以及执行引擎,所有均为此项技术中已知的类型,如根据本发明教示所调适。所述软件架构进一步包含操作系统和文件系统,其同样为此项技术中已知的类型,如根据本发明教示所调适。下文详述此处所说明的类型的存储引擎的构造和操作。所述存储引擎在本文中替代地称为“数据库系统”、“所说明的数据库系统”、“数字数据存储系统”、“数字数据检索系统”等,如在下文的上下文将明显。
所说明的数据库系统支持特定的数据模型,例如关系或分层数据模型,且将查询语言提供给数据库的用户以支持数据定义、数据操纵和数据检索。数据模型定义存储在数据库内的数据的语义,且查询语言定义使用数据模型的语法。
本文论述的是支持所使用的数据模型的存取模型和存储模型,但其独立于所使用的数据模型,使得实际上可高效地支持任何数据模型。存取模型定义高效地支持数据模型所需的原始操作;而存储模型定义充分支持存取模型所需的存储结构。
图4说明存取模型和存储模型如何与用户所使用的查询语法和数据模型相关。
存取模型
出于与数据模型独立的目的,存取模型将数据总体视为原子元素的集合,其中集合例项仅为不具有固有结构的一束元素例项,且元素例项为有区别参考路径和与之相关联的数据值的配对。所有集合例项均由区分不同特性的集合例项的唯一集合路径参考。
可整体插入和删除集合例项;其还可被更新(通过在其内添加和移除元素例项)。因此,将集合例项视为可随意添加或移除的元素例项云。图5说明逻辑集合以及其内的逻辑元素。
在图5中,云中心处的路径表示逻辑集合路径,而每一逻辑元素中的路径表示元素路径。这些集合和元素路径定义可能出现在此集合路径中的集合例项的元数据。
注意,此模型完全不知道可能存在于元素路径之间的任何逻辑关系或集合例项内的元素例项之间的关系或可能存在于跨集合例项的元素例项之间的任何关系。
当与关系模型相比时,集合例项类似于表格行,且每一元素例项对应于一表格列值。集合路径等效于表格名称,且元素路径对应于列名称。这在图6中说明。
元素例项的不存在类似于行中的空列值。表格行的插入和删除对应于整个集合例项的插入和删除。将行的更新建模为一个或一个以上元素例项的移除和/或一个或一个以上元素例项向现存集合例项的添加。
鉴于上文,将了解,存取模型支持关系数据结构。
当与对象模型相比时,集合例项类似于对象例项,且每一元素例项对应于对象例项内的原子字段。然而,注意,对象(其可为其它对象的合计)的结构不反映在集合例项中,而是反映在元素路径参考中。换句话说,集合例项拉平对象结构,而元素路径保留对象结构。举例来说,元素路径可建模嵌套对象结构,例如“.对象.阵列[N].字段”。见图7中的实例。
鉴于上文,将了解,存取模型支持对象数据结构。
当与分层模型相比时,集合例项类似于层次的根,且元素例项对应于存储在层次内的原子属性。更像对象模型,层次由集合例项拉平,但由元素路径保留。举例来说,元素路径可保留XML层次,例如“书/页/段”。见图8中的实例。
鉴于上文,将了解,存取模型支持分层数据结构。
注意,在每种情况下,元素例项为简单的标度数据类型,而其相关联的路径保留其周围的任何复杂结构,且本质上,元素路径执行结构串行化功能。
鉴于上文,将了解,数据模型的结构由存取模型元数据路径保留。
将所有非标量数据结构解析为具有标量数目、标量文本或标量对象的相关联值的多个参考路径。举例来说,将把复合坐标结构(X,Y)分别解析为路径与标量数目对(元素例项),(“X”:数目)和(“Y”:数目)。因此,可将任意复杂的数据类型解析为多个标量元素例项,其元素路径保留复杂数据类型的结构。
鉴于上文,将了解,存取模型可支持任意复杂的数据结构。
鉴于上文,将了解,存取模型独立于任何特定数据模型。
出于清楚的目的,集合和元素与如在标准实体关系建模中所辨识的实体和属性有关,如下,
表4:
ERM概念 |
存取模型概念 |
实体类型 |
集合路径 |
实体例项 |
集合例项 |
属性 |
元素路径 |
属性例项 |
元素例项 |
此存取模型允许任意一组元素例项在任何时间包含在集合例项中。此流动性允许存取模型接受原生数据模型所支持的任何纲要改变,而不强加与原生数据模型无关的约束。
鉴于上文,将了解,存取模型不会不必要地约束原生数据模型。
鉴于上文,将了解,存取模型允许集合路径和元素路径随意地任意且动态地创建。
存取模型要求集合路径是唯一的。因此,集合路径必须含有充足的信息来解析其身份。存取模型要求元素路径在集合路径内是唯一的;但跨集合路径无需是唯一的。因此,元素路径必须始终由其所属的集合路径限制以解析其身份。
举例来说,在关系上下文中,名为“C”的列(元素路径)可出现在多个不同表格(集合路径)中。因此,元素路径“C”的身份可仅由其所属的集合路径的上下文解析。
存取模型不将元素例项的数据类型、域、编码或大小视为重要的。代替的是,将元素意图视为重要的,其中意图定义元素路径的提供关于集合的信息的目的。将元素路径的意图分类为恰好以下各项之一:(识别意图、测量意图、枚举意图以及不透明意图)
识别意图。将元素路径用作识别符。此元素路径仅整体用于参考集合例项或其部分。举例来说,“职员编号”元素路径具有识别意图,且用以参考特定职员例项且不具有其它重要性。识别元素例项在集合例项内在任何一个时间只能拥有一个值,且所述值仅在整体上有意义,且与同一元素路径内的任何其它识别符值相比不具有所暗示的次序或优点。举例来说,职员编号在任何一个时间对于特定职员只能具有一个值;且使用整个职员编号来识别所述职员;且此外,职员编号的比较得不到有用的信息。
测量意图。将元素路径用作同一性质的量度。此元素路径支持元素例项之间的比较以确定优点的次序。举例来说,“职员工资”元素路径具有测量意图,且可用以比较职员,但将不用以识别任何特定职员。测量元素例项在任何一个时间只能拥有一个值,且所述值仅在整体上有意义(所述值的部分不提供任何有意义信息)。举例来说,职员工资在任何一个时间针对特定职员仅具有一个值;且工资由整个工资值指定。
枚举意图。元素路径用于表达拥有一个或一个以上离散性质。举例来说,“职员性别”元素路径将被视为单独拥有男性或女性性质;且“职员地址”元素路径将被视为拥有多个词性质。枚举元素例项内的性质的子集可影响有用信息。举例来说,地址例项中的城市名称性质可独立于同一地址中的其它性质而提供有用信息。
不透明意图。所述元素含有外来信息,且其不具有与存取模型相关的意图。举例来说,PDF文档中的所附职员合同无法用于以任何有用方式识别、测量或枚举职员。
对于属于具有特定意图的元素路径的元素例项的完全动态集合例项的推论是每当创建新的元素路径时就必须制定意图。因此,在此实施例中,元素路径的创建必须指示其意图。
在传统的数据模型中,不存在与元素意图的直接类似。然而,关系和值域约束可用以确定意图。下文的表格呈现可如何从原生数据纲要中的基本数据类型看出意图的概述。所述表格假定每个元素例项值可表达为标量数、标量文本或标量对象。举例来说,可将时间数据表示为一时期内的时间单元的数目。
表5:
|
数目 |
文本 |
对象 |
是关系 |
身份 |
身份 |
N/A |
不是关系 |
测量 |
枚举 |
不透明 |
鉴于上文,将了解,关于元素路径需要知道的唯一信息是容易从原生数据模型确定的其规范名称和意图。
以下表格提供用于辨别出关系数据库纲要中的元素路径意图的规则列表。将所述规则应用于升高优先次序,且当满足条件时,使用对应的意图。
表6:
优先 |
条件 |
意图 |
1 |
具有主要密钥约束 |
识别 |
2 |
具有外来密钥约束 |
识别 |
3 |
具有唯一约束 |
识别 |
4 |
具有所枚举校验约束 |
枚举 |
5 |
具有算术校验约束 |
测量 |
6 |
具有经反演列表索引 |
枚举 |
7 |
具有位图索引 |
枚举 |
8 |
具有B树索引 |
识别 |
9 |
是时间数据类型 |
测量 |
10 |
是布尔数据类型 |
枚举 |
11 |
是数值数据类型 |
测量 |
12 |
是字符类型 |
枚举 |
13 |
是大对象数据类型 |
不透明 |
14 |
是外部链接 |
不透明 |
使用这些规则,较早实例中给出的表格定义将得出以下意图
createtableEmployees
(Namevarchar(64)notnull,=>Enumeration
EmployeeNumbernumberprimarykey,=>Identification
Salarynumber(8,2)notnull,=>Measurement
CommissionRatenumber(4,2),=>Measurement
DepartmentNumbernumberreferencesDepartments(DepartmentNumber));=>Identification
createtableDepartments
(Namevarchar(64)notnull,=>Enumeration
DepartmentNumbernumberprimarykey,=>Identification
RegionNumbernumberreferencesRegions(RegionNumber));=>Identification
createtableRegions
(Namevarchar(64)notnull,=>Enumeration
RegionNumbernumberprimarykey);=>Identification
鉴于上文,将了解关于关系模型内的元素路径需要知道的唯一信息容易从关系纲要确定。
存取模型操作
此存取模型支持的数据操纵操作如下。
A)将整个新集合例项添加到集合路径。将包含在集合例项内的每个元素例项个别地指定为元素路径与值对。
B)整个现存集合例项从集合路径丢弃。移除整个集合例项,包含其中含有的每个元素例项。
C)将元素例项添加到具有集合路径的现存集合例项。将元素例项指定为元素路径与值对。
D)将元素例项从具有集合路径的现存集合例项丢弃。所述元素例项仅由其路径指定。
E)检索与元素例项准则匹配的集合例项。所述准则包含对感兴趣的元素路径和元素例项两者的表达。
这些原始操作的组合足以支持在例如RDBMS等传统数据库系统中所见的数据操纵操作。
对于关系数据库系统,
通过以下操作来实施将具有特定列值的新行插入到表格中
A)插入含有特定元素例项(列值)的新集合例项(行)
通过以下操作来实施从表格查询与列准则匹配的行
A)检索与所需元素路径(列)准则匹配的集合例项(行)
通过以下操作来实施从表格删除与列准则匹配的行
A)检索与所需元素路径(列)准则匹配的集合例项(行)
B)丢弃检索到的集合例项。
通过以下操作来实施更新一组表格行中的列值
A)检索与所需元素路径(列)准则匹配的集合例项(行)
B)从检索到的每一集合例项(行)移除前任元素例项(列值)
C)将后继元素例项(列值)添加到检索到的每一集合例项
鉴于上文,将了解,存取模型支持关系数据库系统所需的基本数据操纵操作。
此存取模型通过将论断应用于一个或一个以上元素路径使得仅检索符合论断准则的集合例项来允许集合例项的检索。举例来说,通过论断职员编号路径含有所需的职员编号来检索具有特定职员编号的职员集合将是可能的。
论断的本质与其参照而表达的元素路径的意图有着千丝万缕的联系,且存取模型允许对每一意图的以下论断,
A)所有意图。可基于任何意图的元素路径中的元素例项的存在或不存在来论断集合例项。
B)识别意图。可基于识别元素例项与所寻找身份的等效性来论断集合例项。不存在对识别符的任何次序或优点暗示,且因此其它论断均不适用。实际上,真实世界识别符可含有次序的一些暗含概念,但这不是通过此存取模型而知道或假定的。
C)测量意图。可基于属于定界范围内的测量元素例项论断集合例项。可能不存在测试测量值的部分的企图,因为其表示可能值谱上的单个点,且匹配测量值的部分的任何企图暗示关于所述值的内部表示的一些知识,这超出了此存取模型且是非决定性的。存取模型允许使用共同边界将所定界范围减小到单个点,且还允许下限表达为负无穷且/或上限表达为正无穷。
D)枚举意图。可基于枚举元素例项内是否含有一个或一个以上性质来论断集合例项。
E)不透明意图。不透明意图的元素例项不提供除其存在或不存在之外的有用信息。
因此,每一意图与同其有关的特定论断运算符相关联,且提供以下论断运算符。
A)运算符“is”。论断识别元素例项“是”等效于识别符。
B)运算符“in”。论断测量元素例项落在所定界范围“中”。
C)运算符“has”。论断枚举元素例项“具有”一个或一个以上性质的所有权。
D)运算符“exists”。确定元素例项是否“存在”且可结合任一意图的元素路径使用。
论断运算符中的每一个返回每一集合例项的布尔结果,如下,
表7:
在以上表格中,每一论断运算符用于元素路径e的上下文中,元素路径e完全由其含有的集合路径限制。
以下关系实例说明每一论断运算符的使用,
c不为空;译为exists(C)
c=123456;译为is(C,123456)
c介于1与10之间;译为in(C,1,10)
c类似“%约翰%史密斯%”;译为has(C,'约翰','史密斯')
在以上实例中,C为列名称(元素路径),其假定为由其所属的表格名称(集合路径)限制。
此存取模型中的论断运算符所支持的准则可能不如原生数据模型运算符丰富。举例来说,“has”运算符的表达性比SQLLIKE运算符受限。然而,这些论断运算符提供充足表达以允许通过原生数据模型运算符识别和检索,且接着进一步减少集合例项的严格超集。
在一个实施例中,“is”运算符支持任意数目的识别常数,且论断识别元素例项等效于所述常数中的任一个。
在一个实施例中,“in”运算符支持左右包含性定界指示符,其指定应将左界限和右界限各自视为包含性的还是排它性的,以用于确定测量元素例项的封入。
在一个实施例中,“has”运算符支持正规表达操作数,其应用于每一枚举元素例项以确定其一致性。
在一个实施例中,每一元素路径可具有一个以上意图,且假定每个元素路径除其测量或枚举意图之外还具有识别意图。
鉴于上文,将了解,存取模型论断运算符支持与原生数据模型中可能的论断准则的等效性或接近有用等效性。
具有识别意图的元素路径可卷入表达集合路径与另一运算符之间的关系,提供所述另一运算符以通过其识别元素例项的等效性支持将多个集合例项绑定在一起。此运算符是绑定运算符,其论断跨两个元素路径的元素例项的等效性。将绑定运算符定义为
表8:
此运算符等效于关系数据模型中的内等联接。举例来说,SQL语句中的联接,例如,
whereEmployees.DepartraentNo=Departraents.DepartmentNo
可由绑定运算符表达为,
bind('Employees.DepartmentNo','Department.DepartmentNo')
其针对“职员”和“部门”集合路径中的集合例项的每一组合返回“真”,其中所述路径在“部门编号”元素路径中具有等效元素例项。
鉴于上文,将了解,存取模型支持关系模型中的共同论断和等联接条件。
清楚的是,可扩展绑定运算符以包含藉此支持等效于关系外联接、交叉联接和自联接的绑定操作的选项。对于外联接,一个或两个集合路径可与外联接指示符相关联。对于交叉联接,可省略元素路径操作数。对于自联接,集合路径别名操作数与每一集合路径相关联,使得同一集合路径可出现在不同别名下,且有效地处理为每一不同别名下的单独集合路径。这类似于关系SQL中所使用的别名机制。
鉴于上文,将了解,存取模型支持关系模型中的自联接、交叉联接和外联接条件。
在一个实施例中,“bind”运算符支持集合路径的共用集合例项内的不同元素路径之间的等联接,以建模关系查询,其中比较同一表格中的列的相等性。
此存取模型要求通过识别元素例项的等效性来实施关系,且允许通过绑定其相应的身份元素路径在检索时建立集合路径之间的关系。可将具有身份意图的任何两个元素路径任意绑定在一起,且此存取模型无需知道那些单独元素路径强制执行关系,直到元素路径在查询时明确地绑定在一起为止。注意,原生数据库纲要可知道实体之间的明确关系,但无需使此存取模型明白这些,直到查询定义为止。
鉴于上文,将了解,在实体为查询目的而表达之前,存取模型不需要实体之间的关系的定义。
虽然此模型假定可将任何身份元素路径绑定到任何其它身份元素路径,但这要求测量、枚举和不透明元素路径将永不被绑定,因为其不会出于等效性绑定的目的而表达等效性。
此存取模型允许使用布尔代数来组合多个论断和绑定运算符,以创建并入有多个条件和元素路径的复合表达式。
原生数据模型中的一些语句可将单个语句中的多个查询组合在一起。在关系上下文中,这结合子查询和组运算(例如并集和相交)而发生。个别查询可由如上文所述的存取模型运算符服务,且复合语句的逻辑可由查询执行引擎解析。
绑定运算符解析
下文描述用于解析跨复合布尔表达式的绑定运算符的方法,藉此可独立地评估论断运算符且藉此可独立地应用绑定条件;允许同时应用多个CPU和存储资源。
在解析绑定运算符的此实施例中,要求复合运算符表达式必须以析取范式(DNF)表达,其为合取项的析取,所述合取项各自含有运算符文字的结合。
在别处已在数学上证明,每个复合布尔表达式可通过使用布尔公理和定律(例如,关联性、分配性和德摩根定律)重构为DNF。用于将布尔表达式变换为DNF的方法在别处广泛涵盖,且此处将不进一步考虑。
在解析绑定运算符的此实施例中,要求合取项针对出现在DNF的同一合取项内的任何地方的每个集合路径含有至少一个论断运算符。为此,通过存取模型提供以下平凡论断运算符。
表9:
运算符 |
返回 |
i注释 |
true(c) |
对于集合路径c中的所有例项为真 |
要求集合路径作为操作数 |
在解析绑定运算符的此实施例中,要求在每一合取项内,移除分别普遍地相当于真或假的任何运算符或合取项,如下。
表10:
表达式 |
减少 |
注释 |
in(e,a,b) |
移除项 |
其中a>b |
in(e,a,b) |
移除运算符 |
其中a为负无穷,且b为正无穷 |
在解析绑定运算符的此实施例中,要求在每一合取项内,可将针对共用元素路径的两个或两个以上运算符减少到单个运算符,以简化合取项,如下。
表11:
在解析绑定运算符的此实施例中,从合取项移除true()运算符,其中用于同一集合路径的另一论断运算符已经存在于同一合取项内。
在解析绑定运算符的此实施例中,反复地应用减少规则以尽可能多地简化合取项。
在解析绑定运算符的此实施例中,通过移除含有对同一DNF中的其它合取项相同的运算符与操作数的组合的结合来减少重复合取项。
下文说明SQL-where子句到所描述的存取模型运算符的布尔DNF的转换
...where(Employees.salarybetween10000and35000)
and(Employees.Commissionisnotnull)
and(Employees.DepartmentNo=Departments.DepartmentNo)
and(Departments.RegionNo=Regions.RegionNo)
and((Regions.Name='North')or(Regions.Name='East'))
当使用所描述的存取模型运算符时,上述SQL子句变为以下布尔表达式
in('Employees.Salary',10000,35000)
andexists('Employees.Commission')
andbind('Employees.DepartmentNo','Departments.DepartmentNo')
andbind('Departments.RegionNo','Regions.RegionNo')
and((is('Regions.Name','North')oris('Regions.Name','East'))
当此布尔表达式转换为DNF时,其变为
(in('Employees.Salary',10000,35000)
andexists('Employees.Commission')
andbind('Employees.DepartmentNo','Departments.DepartmentNo')
andbind('Departments.RegionNo','Regions.RegionNo')
andis('Regions.Name','North')
andtrue('Departments')
or
(in("Employees.Salary",10000,35000)
andexists('Employees.Commission')
andbind('Employees.DepartmentNo','Departments.DepartmentNo')
andbind('Departments.RegionNo','Regions.RegionNo')
andis('Regions.Name','East')
andtrue('Departments')
注意,已针对每一合取项中的“部门”集合路径介绍了true()运算符,因为其出现在绑定运算符内,但在同一集合项中,不存在应用于其的论断运算符。
在解析绑定运算符的此实施例中,要求每一论断运算符通过产生一组集合例项来评估其自身。此组被称为集合组,且针对其中论断运算符为真的每一集合例项含有一个成员。每一组成员是以下信息的向量。
身份。这唯一地识别集合的例项。出于本发明论述的目的,假定此身份为集合路径内的集合例项的排序位置。
基数。这定义成员在绑定内必须重复的次数。当集合组首次由论断运算符产生时,此基数始终为1。
序列。这定义必须绑定集合例项的次序。当集合组首次由论断运算符产生时,此序列始终为0。
因此,在以上实例中,in(“职员.工资”,10000,35000)的运算符评估将为以下集合组
表12:
虽然存在('职员.佣金')的运算符评估将为以下集合组
表13:
在解析绑定运算符的此实施例中,要求对应于合取项内的同一集合路径的集合组接着组合,藉此舍弃并不出现在每组中的任何成员。
在所述实例中,当从上述两个集合组组合时,这针对“职员”路径得出以下集合组。
表14:
在一个实施例中,针对每一论断运算符而产生的集合组可跨集合向而共享(而不是重新产生),其中同一运算符与操作数组合在其它地方出现。
在一个实施例中,经组合的集合组也可共享,其中它们组合完全相同的运算符和操作数。在此实例中,上文的经组合集合组可跨两个合取项而共享,因为其已从运算符与操作数的同一组合产生。
基于以上实例中的第一合取项,“职员”、“部门”和“区”集合路径的集合组将为
表15:职员集合组
表16:部门集合组
表17:区集合组
注意,在此实例中,针对“职员”集合路径的论断运算符(“in”和“exists”)与DNF表达式的两个合取项中的相同操作数一起出现,且因此从中产生的集合组可跨两个集合项而共享。针对“部门”路径中的“true”运算符为类似情况;而用于“区”路径的“is”运算符不能共享,因为其使用不同的操作数。
在解析绑定运算符的此实施例中,每个集合组接着由出现在同一合取项内的绑定运算符绑定,以更新每一集合路径的绑定序列和基数。稍后详细描述用于绑定集合组的方法,但出于本发明论述的目的,绑定过程将针对每一集合路径产生以下集合组。
表18:职员集合组
表19:部门集合组
表20:区集合组
在此实例中,在绑定过程已完成之后,可独立地且并行地针对每一集合组检索集合例项,以物质化查询所需的结果。以组序列的次序返回每一集合组的集合例项,且根据其组基数重复每一集合例项。对于基数N,集合例项恰好出现N次,使得对于基数0,完全省略所述集合例项。
在此实施例中,最终结果中不需要用于集合路径的任何集合组,但其只因绑定依赖性而出现、可舍弃且无需检索。
此实例将得出以下结果,其中从“职员”和“区”集合路径仅需要“姓名(名称)”元素路径。
表21:
此实例提供针对单个合取项的所需结果,且必须针对DNF表达式中的所有合取项重复上述过程。
在此实施例中,来自每一合取项的结果独立地且同时地产生,且随后累加以提供最终且完整结果。存在可跨合取项复制结果的可能性。因此,在累加时必须减少复制来自每一合取项的结果。
在一个实施例中,这是通过产生集合例项身份的向量的散列图来进行的,因为结合结果经累加,且可舍弃具有与前一结果对应的向量身份的任何结果。
鉴于上文,将了解,此检索方法允许每一集合路径内以及每一合取项内的集合例项独立且并行地处理,从而允许同时使用多个硬盘资源。
绑定传播
下文描述用于绑定集合项内的集合组的方法,其中在从存储装置检索查询结果之前组合集合组;允许单独检索来自每一集合路径的查询结果。
如上文所述,绑定运算符接受两个完全合格的元素路径,且在形成总DNF表达式的部分的结合的上下文内使用。每一绑定运算符耦合到同一合取项内的恰好两个集合组。
在绑定运算符内,发生“相关绑定”,其中运算符的一侧上的集合组中的集合例项内的给定元素例项在绑定运算符的相对侧上的集合组中的一个或一个以上集合例项中具有至少一个等效元素例项。
考虑针对以上实例集合组的bind(“职员.部门编号”,“部门.部门编号”)。
表22:职员集合组
表23:部门集合组
表24:职员表格
身份 |
部门编号 |
1 |
100 |
2 |
200 |
3 |
200 |
表25:部门表格
身份 |
部门编号 |
1 |
100 |
2 |
200 |
3 |
300 |
可看出,“职员”集合路径中的集合身份2和3具有“部门编号”200,其在集合身份2处的“部门”集合路径中具有相关绑定。然而,在“部门”集合路径中,集合身份3不具有相关绑定。
每一相关绑定具有反映所述绑定的每一侧上的匹配元素例项的数目的基数。因此,对于相关绑定的一侧上的给定元素例项,另一侧上将存在界定绑定基数的若干等效元素例项。
在以上实例中,“职员”集合路径中的集合身份2和3的绑定基数具有绑定基数1;而在“部门”集合路径中,集合身份2具有绑定基数2(在相反方向上,跨同一相关绑定)。
在此实施例中,使用以下方法来实施在单个合取项内的绑定过程。所述方法假定具有任意数目个绑定运算符的任意数目个集合组耦合任意布置中的不同集合组的对。绑定运算符不能将集合组绑定到其自身。
在绑定过程的此实施例中,访问序数属性包含在上文已经针对集合组的成员而描述的向量中。在绑定之前,对此访问序数指派值零。
因此,在绑定过程之前,具有集合例项11、12、13的集合组将如下出现
表26:
在无任何绑定的情况下,将使用此集合组以所述次序且无重复地提取集合例项11、12、13。
在此实施例中,在绑定过程期间,以特定次序访问绑定运算符和集合组,且为每一绑定运算符指派一唯一访问序数,且为每一集合组指派一唯一访问序数和一传播计数。
在此实施例中,绑定解析过程依次遵循三个阶段,其中后续阶段仅在前一阶段已完成时才开始,如下。
阶段1
此阶段被称为原点选择阶段。
将单个集合组(合取项内)选择为原点集合组。可任意选择组,但有利的是,所选择的组可为对应于包含在查询结果中的集合路径的那些组之中的最小组。
为所选择的原点组指派访问序数0。
原点组的成员使其序列以严格的单调递增的序列更新,针对组中的第一成员以1开始。如果选择了以上组,其将变为
表27:
阶段2
此阶段被称为成员传播阶段,且涉及跨每个绑定运算符传播成员。
在此阶段期间,决定并记录绑定运算符访问的次序。为每一绑定运算符指派一访问序数,其针对所选择的第一绑定运算符以1开始,且针对所选择的每一后续绑定运算符递增。
每一绑定运算符耦合两个集合组,且在所述两个集合组中,不被指派访问序数或具有两个集合组的最低访问序数的集合组被指派所述绑定运算符的访问序数。
从直接附接到原点组的绑定运算符之一任意选择被指派访问序数1的第一绑定运算符。为在绑定运算符的与原点组相对的侧上的集合组指派访问序数1。
在此实施例中,将集合组成员从起源组(具有最低访问序数)传播到附接到所选绑定运算符的终止组(具有最高访问序数),如下。
对于起源组中具有比当前传播的绑定运算符的访问序数小一的访问序数的每一非零基数成员,复制成员并将其附加在具有与起源成员的对应绑定的每一终止成员的终止组内。
对于附加到终止组的每一成员,指派与其从中复制的终止成员相同的集合身份;将访问序数指派为传播绑定运算符的访问序数;从起源成员指派序列;且将基数指派为1。
在此实施例中,起源组中不在终止组中具有对应绑定的任何成员的基数均被指派为零。此后,将所述起源成员视为空,且不再进一步传播。
在此实施例中,以成员次序从起源组传播成员。其它实施例可选择替代次序。
所有所传播条目上的基数与当前访问序数的总和被指派给终止组,作为其传播计数。如果终止组的传播计数从先前指派减少,那么附接到具有所指派的访问序数的终止组且附接到具有与所述绑定运算符相同的访问序数的另一集合组的任何其它绑定运算符使其运算符访问序数解除指派。
其后,从所有绑定运算符中选择不具有所指派的访问序数但直接附接到确实具有所指派的访问序数的组的下一绑定运算符;且从那些绑定运算符中,选择连接到具有最高所指派访问序数的集合组的绑定运算符;如果可选择的绑定运算符中的一个或一个以上在另一端处也附接到具有已经指派的访问序数的组,那么选择附接到具有最低访问序数的组的运算符。
为所选的绑定运算符以及所述运算符的另一侧上的终止组指派下一访问序数。如果另一侧上的组具有已经指派的访问序数,那么用新的访问序数盖写所述访问序数。
重复此过程,直到不再能找到不具有访问序数但附接到具有所指派的访问序数的组的绑定运算符为止。如果在此阶段结束时,存在不具有访问序数的组,那么将查询视为有缺陷的,且中止整个查询。
考虑以下两个集合组,其中第一组为原点组。在此实例中,假定所述两个集合组之间存在具有访问序数1的绑定运算符,且为清楚起见,假定仅在其中止身份中具有对应的下标字母的成员跨绑定运算符具有对应的绑定。
集合路径1(在成员传播之前)
表28:
集合路径2(在成员传播之前)
表29:
传播成员11B得出以下中止集合组。
集合路径2(在经由运算符1传播成员11B之后)
表30:
成员12A不具有对应的绑定,且因此不在中止组中创建任何成员,但此条目的基数在起源组中设定为零。这针对起源组得出以下结果。
集合路径1(在传播成员12A之后)
表31:
传播成员13C得出以下中止组,
集合路径2(在经由运算符1传播所有成员之后)
表32:
注意,可接着通过另一绑定运算符将上述中止组传播到另一组中,但将仅传播具有访问序数1的成员。
阶段3
此阶段称为基数反映阶段,其中以严格的反向访问序数次序访问每一绑定运算符。被访问的绑定运算符称为反映运算符。
在每一反映运算符处,使起源组中具有比反映运算符小一的访问序数的每一成员的基数乘以具有与起源成员相同的序列以及与反映运算符相同的访问序数的所有终止成员的基数的总和。
在以上实例中,将如下更新起源组的基数
集合路径1(在基数反映之后)
表33:
集合路径2(在基数反映之后)
表34:
下文提供四个集合组可如何被访问且使其访问序数在绑定过程的第二阶段期间被指派的实例。矩形表示集合组,且线表示其间的绑定运算符。
图9:选择原点组,并为原点组指派访问序数0。
图10:从附接到原点组的绑定运算符中选择第一绑定运算符,且为所选的绑定运算符指派访问序数1。为所选的绑定运算符的另一侧上的终止组指派与所述绑定运算符的访问序数相同的访问序数。
图11:从不具有所指派的访问序数且附接到具有最高访问序数的集合组的那些绑定运算符中选择第二绑定运算符。
图12:如果用于运算符2的终止组的传播计数减小,那么附接到所述集合组且具有与另一端处的集合组访问序数相同的运算符访问序数的任何其它运算符使其运算符访问序数解除指派。
图13:从不具有所指派的访问序数且附接到具有最高访问序数的集合组的那些绑定运算符中选择下一绑定运算符。
图14:如果组3的传播计数不因运算符3而减小,那么将如所展示指派后续运算符。
不再能找到不具有所指派访问序数的运算符,且绑定过程的此阶段完成。所有组具有所指派的序数,且因此将绑定视为良好地形成,且可进行到下一阶段。
在此实施例中,一旦所有三个绑定阶段已完成,就可独立地检索每一集合组的集合例项以实现查询物质化,且其独立结果合并。仅针对具有与指派给集合组本身的访问序数相同的访问序数的成员检索集合例项,如下。
忽略集合组中具有基数零的每一成员;对具有基数1的每一条目检索一次;对具有大于1的基数的每一条目检索一次,但经复制以遵守绑定的基数。
在一个实施例中,以序列次序检索每一组成员,且以集合身份次序取具有相同序列编号的条目。
在替代实施例中,首先以集合例项识别符次序(而不是序列次序)检索成员,且就在合并之前,以序列次序将存储器中对结果进行排序。
在替代实施例中,可在单个存储读取请求中从存储装置检索共用存储区域内的连续集合例项或几乎连续的集合例项。
应了解,由绑定过程操纵的临时结构可驻存在物理存储器内,以辅助合取项的快速解析。
应了解,绑定过程可在物质化查询所需的任何结果之前,在物理存储器内操作和完成。
应了解,在合取项已完全解析之后,存储引擎可独立地检索每一集合组,且并行地得出查询所需的结果。
通过从所述集合组检索具有零基数且在最终结果中包含它们的任何集合例项解析针对外联接而标记的集合路径的结果。
通过迫使起源集合组中的每个成员跨针对交叉联接而标记的绑定运算符与终止集合组中的每个成员相关联来解析交叉联接。
在一个有用实施例中,true()运算符的集合组由试图绑定其的第一bind()运算符怠惰地评估,其中从起源集合组的对应绑定创建true()运算符的集合组。在此实施例中,永不将true()运算符的集合组选为原点组。将了解,在怠惰评估的此实施例中,与急切评估相比,true()运算符的集合组的大小可能减少很多。
存储结构
下文描述用以高效地存留和检索数据以支持上文所述的存取模型的存储结构。
将存储装置构造为大量线性隧道,其中每一隧道与存储地址空间对准,且含有关于与一个集合路径和/或一个元素路径、一个运算符和一操作数子集相关的集合例项的信息。
单个元素路径隧道提供关于元素路径内的大量元素例项的每个元素例项的部分信息。集合路径隧道提供关于集合路径内的单个集合例项的完整信息。
隧道的结构根据存取模型运算符以及需要其支持的操作而变化。每一隧道含有支持其对应运算符所需的最少信息,使得每个隧道与存储地址维度最佳对准,且每一运算符可以高效方式遍历其相关隧道。
单元内含有的最少信息可能仅对有关的存取模型运算符指示实体例项与给定操作数相关的可能性或不可能性来说是足够的。
针对存取模型内的每一运算符提供不同的隧道族。连接隧道提供信息以支持存取模型IS运算符;特性隧道提供信息以支持存取模型HAS运算符;组合隧道提供信息以支持存取模型IN运算符;这些族中的每一个提供隧道以支持EXISTS运算符;而集合隧道提供信息以支持高效集合检索。
将每一隧道布置为线性单元序列,藉此以年月日次序附加新的隧道和新的单元,同时以相反年月日次序遍历隧道。布置隧道和单元,藉此隧道之间的单元对应,使得遍历可根据需要在隧道之间移动。这在图15中加以说明。
考虑每一隧道族具有粘度和速度两种特性。粘度指示本地保存多少关于隧道内的集合例项的信息。隧道的速度指示本地保存在隧道内的集合例项总体的大小。这些特性彼此相反,使得本地含有关于特定集合例项的较多信息的高粘性隧道也含有关于作为整体的总体的较少信息。
与存取模型论断和绑定运算符有关的隧道展现高速度和低粘度。用于集合例项检索的隧道展现高粘度和低速度。
集合隧道将元素例项分组为集合例项。每一集合路径针对每个集合例项含有一单独隧道,且通过遍历其集合隧道从而允许快速检索集合例项来检索整个集合例项。这些隧道被视为越过集合例项具有非常低的速度,因为其在每一集合例项内的元素例项粘度较高。
连接隧道根据识别元素例项的等效类似性对其进行分组。这些隧道支持IS和BIND存取模型运算符;从而允许IS运算符针对含有等效于运算符操作数的识别元素例项的集合例项产生集合组;同时允许BIND运算符高效地解析由其它存取模型运算符创建的集合组之间的相关绑定。针对每一识别元素路径,存在多个连接隧道。将这些隧道视为跨集合例项具有非常高的速度。
特性隧道根据枚举元素例项含有的性质对其进行分组。这些隧道支持HAS存取模型运算符,从而允许其针对具有含有等效于运算符操作数的一个或一个以上性质的枚举元素例项的集合例项产生集合组。针对每一识别元素路径,存在多个特性隧道。将这些隧道视为跨集合例项具有较高的速度。
组合隧道相对于基数点对部分量值的测量元素例项进行分组。这些隧道支持IN存取模型运算符,从而允许其针对具有由运算符操作数定界的测量元素例项的集合例项产生集合组。这些隧道还支持聚集操作,从而允许测量元素例项累加并分类,而无需回顾整个集合例项。针对每一识别元素路径,存在多个组合隧道。将这些隧道视为跨集合例项具有中等速度。
每个元素路径具有对应的存在隧道,以支持EXISTS存取模型运算符。针对每一元素路径,存在一个存在隧道。将这些隧道视为跨集合例项具有较高的速度。
因此,在此实施例中,存在为具有论断运算符的每个元素路径维持的综合隧道族。
查询中所使用的论断运算符确定待遍历的隧道族,而其操作数确定集合路径、元素路径和隧道数目。
鉴于上文,将了解,任何论断运算符均可高效地遍历集合例项总体,而无需单独的索引结构,且无需大量的优化策略来迎合可能存在或可能不存在的索引结构。
将了解,隧道的同类单元结构适合供CPU处理,所述CPU提供同时对数据的多个项目操作的向量指令。
当评估运算符时,其创建基于存储器的集合组,其中所述组的每一成员提供关于包含在评估中的每一集合例项的信息。如先前所提到,运算符可仅能够提供集合例项与运算符操作数的相关的可能性或不可能性的指示;但运算符也可具有对相关的完全确定性。因此,每一集合组成员含有确定性的指示符,使得稍后的查询物质化可出于元素检查和检验的目的而确定对额外物质化的需要。
有用地,藉以组合集合组并使其相关的绑定集合组的过程将用以通过舍弃不确定的集合组成员来增加确定性。
将时间细分为绝对时间帧,藉此每个帧涵盖相对于预定义时期日期的固定且预定义的时间间隔,使得任一给定时间被指派有根据自从所述时期日期开始已发生的时间帧间隔的数目得出的帧编号,使得所述时期日期在时间帧0开始时出现。
时期日期和帧持续时间经选择以使得帧编号为正,且其量值可包含在合理精度内。
在一个有用实施例中,将时期日期选择为当前世纪的开始,且将帧持续时间选择为1小时。
将所有隧道细分为绝对时间帧,使得任一给定时间帧跨所有隧道对应。帧跨隧道的对准允许检索操作在帧边界处在隧道族之间切换,且为所需的导览方向选择最佳隧道族。举例来说,对特定集合例项的搜索最初可使用连接隧道,且在已找到可能的元素例项单元时,切换到对应帧中的集合组。
在此实施例中,将隧道作为连续单元序列存储在一个或一个以上文件内;藉此每一隧道族(集合、连接、特性、组合)均具有多个文件序列;藉此针对每一集合路径存在一个文件序列;且其中每一文件序列针对每一时间帧具有一单独文件。每一文件序列位于根据隧道族和集合路径身份确定的目录路径中;且每一文件在其名称内含有帧编号。此布置在图16中说明。
在存在多个不同数据库的情况下,每一数据库的目录结构将驻存在一单独的数据库路径下。
在替代实施例中,将隧道族(连接、特性、组合、集合)放置在正下方具有每一数据库路径的层级的顶部。这允许隧道族容易地定位在具有最适合每一隧道族的性能特性的不同存储系统上。
因此,在此实施例中,每一文件针对帧内的隧道含有单独的连续单元序列,且每一隧道与一特定集合路径、元素路径、运算符及其操作数有关,从而允许存取模型运算符从存储装置读取具有最小读取请求的相关隧道,且以最小的高速缓冲存储器污染导览所述隧道。
因此,在此实施例中,将具有类似创建时间的集合例项的总体定位在共用帧文件内。
鉴于上文,将了解,通过具有类似年龄的集合例项的大总体驻存在其中的帧文件来删除所述总体。
在替代实施例中,帧边界由与之相应的集合例项的数目的所定义阈值确定,藉此一旦每一集合路径内达到所述阈值,就关闭帧。
鉴于上文,将了解,可通过移除最老帧文件中的一个或一个以上来精确地管理个别集合路径总体的大小。
操作(OLTP)查询本质上是选择性的,且将主要使用IS和BIND存取模型运算符,且因此对操作查询的导览可能是沿一个或一个以上连接(非常高速度)隧道,以快速识别相关的集合例项,接着是沿一个或一个以上集合隧道(低速度)的导览,以检索特定集合例项数据。绑定解析工作的大部分将在物理存储器内发生,且将得出较少数目的特定集合例项地址,从而允许通过较少数目的随机存储读取操作快速返回查询结果。
分析(OLAP)查询范围较广,且完全不可能使用集合隧道,且将整体包含在连接(非常高速度)、特性(高速度)和组合隧道(中等速度)内,从而允许OLAP查询快速地遍历集合例项的总体。任何聚集工作的大部分可直接在秩隧道上执行,所述秩隧道可通过较少数目的大循序存储读取操作读取到存储器中。
有利的是,借助集合路径和隧道族来分离文件序列允许不同的隧道族定位在具有不同性能特性的不同文件存储区域上。集合隧道主要用于操作存取,且含有短集合隧道。这些文件可位于最适合较小随机读取请求的存储介质上;而其它隧道族可位于最适合较大循序读取请求的存储介质上。
鉴于上文,将了解,操作和分析工作负载两者可高效地支持选择查询和集合查询两者。
在此实施例中,隧道以正向年月日次序附加,且使用集合附加和集合反演语义来创建、删除和更新集合例项。集合的删除涉及将集合反演附加到所有与原始集合例项相关的隧道,使得涉及原始集合例项的所有操作均知道任何后续反演。
因此,在此实施例中,不存在就地更新操作,且对集合路径内的隧道族的所有更新均为本地化的。
鉴于上文,将了解,可使用单个或最小数目的存储写入请求来高效地应用对集合路径内的任一给定隧道或任一给定隧道族的所有更新。
鉴于上文,将了解,对任一给定隧道或任一给定隧道族的所有更新可利用当代的存储系统所展现的高传送速率。
鉴于上文,将了解,为每个集合例项维持完整的寿命循环历史。
鉴于上文,将了解,保持因守法性和审计调查引起的解析查询所必需的数据。
鉴于上文,将了解,论断运算符可包含任选的临时操作数,使得论断运算符可从通常提供历史时间点查询的历史时间帧开始其查询。
集合例项可仅在其已首次被创建之后反演。在此实施例中,以反向年月日次序遍历隧道,以允许集合反演在其对应的较早集合附加操作之前被删除,使得可高效地确定集合例项的存在,且可有效地舍弃反演的集合例项。
鉴于上文,将了解,论断运算符将不会遇到从运算符导览开始已经创建的单元,且有利地无需考虑它们。
在一个替代实施例中,指定集合路径中在指定帧之前的每一隧道族中的所有帧可任选地合并,藉此扫描每一先前帧文件的内容,并将其复制到帧文件的新版本中,但舍弃所有所发现的反演集合例项及其对应的经反演集合例项。经合并的帧文件将不含有完整的集合例项历史,但将比其代替的帧文件紧凑。
每一元素路径含有具有每个帧的帧图,其告知关于在当前帧之前的单个或多个帧内的所有元素例项的部分信息。每一帧图允许存取模型运算符确定那些在前帧与其操作数相关,且允许运算符排除不含有相关信息的帧。
在此实施例中,用于识别意图的元素路径的帧图含有关于身份字节序列内哪些位含有帧间隔内的所有元素例项的共用值的信息。
因此,在此实施例中,其中识别元素路径内的元素例项在识别字节序列的一个部分或多个部分中展现始终单调增加或减小的序列,使得所有元素例项的一些部分跨帧间隔而共用;接着可通常排除一个或一个以上帧间隔,其中那些帧间隔内的所有元素例项的共同方面并不符合所寻找的识别符。
在此实施例中,用于测量意图的元素路径的帧图含有关于帧间隔内的所有元素例项的最小值和最大值的信息。
因此,在此实施例中,其中元素路径内的测量元素例项展现始终单调增加或减小的值;接着可通常排除一个或一个以上帧间隔,其中那些帧间隔的最小值和最大值并不围入所寻找的测量。
在此实施例中,用于枚举意图的元素路径的帧图含有关于帧间隔内的至少一个元素例项中存在哪些性质的信息。
因此,在此实施例中,其中元素路径内的枚举元素例项展现性质的稀疏分布;接着可有用地排除一个或一个以上帧间隔,其中所寻找的枚举含有那些帧间隔内不存在的性质。
鉴于上文,将了解,存取模型运算符能够通过避免不含有与运算符及其操作数相关的数据的帧来高效地导览隧道。
鉴于上文,将了解,存取模型运算符能够高效地遍历隧道以进行选择和集合查询存取,而无需任何额外的导览结构(例如索引)来支持特定查询要求,且因此移除了此些结构通常需要的设计、管理和维护精力以及资源投资。
鉴于上文,将了解,存取模型运算符能够导览隧道,使得不需要单独搜集基于成本的查询优化的统计数据,也不需要多个优化策略。
历史帧(其在当前时间帧之前出现)内的隧道和图结构存储在连续存储布置中,使得可用单个存储读取请求读取完整结构。
有利的是,来自多个帧的非集合隧道可从先前帧累加,且连续地写入到用于新帧的后续文件,以最小化当遍历给定隧道时必须咨询的帧文件的数目。这最小化遍历给定隧道所需的存储读取请求的数目,且较好地利用从存储系统可能的传送速率。
在此实施例中,对于预定义间隔V,对于帧编号N,其中N为V的整数倍,通过从帧N-1...N-V读取隧道且接着附加帧N的隧道内容并将累加存储在帧N中来累加帧N中的每一隧道。这在后续帧中继续,直到可用于高效地累加隧道的存储器不足为止;因此帧N中的隧道仅含有帧N的内容。
因此,导览帧的存取运算符能够导览多个先前帧,且无需访问已经累加在当前帧文件中的帧文件,且能够在单个较大读取请求中读取横跨多个帧的隧道。
鉴于上文,将了解,存取模型运算符可通过利用当代硬件环境常见的高传送速率来高效地导览隧道,且以最小的高速缓冲存储器污染来导览隧道。
在一个有用实施例中,上述V的值为1,使得每个帧从就在之前的帧累加尽可能多的内容。在此实施例中,优化运算符导览的效率。
在另一有用实施例中,上述V的值为无穷大,使得除了其自己的帧之外,没有帧累加任何内容。在此实施例中,优化更新效率,且最大化存储装置的利用率。
鉴于上文,将了解,可将以上V的值设定为优化特定性能方面。还将了解,可响应于任一时间点处的特定性能需求动态地更改V的值,以优化特定性能方面。
有利的是,可截短每一文件序列,使得根据需要且在需要时移除最老的帧文件。这可针对每一集合路径单独执行,从而允许数据库精确地管理为每一集合路径个别地保持的数据的寿命循环。
鉴于上文,将了解,可通过集合路径和时间帧粒度来精确地管理数据寿命循环。
在一个实施例中,个别地安全加密集合隧道使得与任一单个集合例项有关的整个信息在单个文件位置中不可用是可能的。有利的是,可个别地加密和解密每一集合隧道,从而允许寻址单个集合隧道时的可能最好性能。有利的是,用于集合隧道的加密密钥可基于私人种子、集合路径、帧编号以及隧道编号,以确保每一集合例项具有唯一加密密钥。用于双向加密/解密的方法广泛地涵盖在其它地方,且此处不进一步考虑。
在替代实施例中,有可能单独且个别地安全加密和解密集合数据隧道内的集合单元。
鉴于上文,将了解,可个别地高效加密和解密集合例项数据,以防止对整个集合数据的未经授权的存取,而无需加密和解密整个文件。
在此实施例中,将活动事务累加在用于当前时间帧的堆文件中。将存在与当前时间帧有关的一个堆文件以及与最近关闭的时间帧有关的零个或零个以上堆文件。每一堆文件的名称含有所述堆文件在其中创建的时间帧的编号。
将堆文件构造为具有固定大小的片段的堆,藉此每一片段与特定事务、特定集合路径内的特定集合隧道有关。一旦关闭,就将堆文件的内容迁移到对应于同一时间帧的多个帧文件。在存储器中通过联合对应于同一集合路径、元素路径和隧道编号的片段来组成每一帧文件。
在此实施例中,将当前时间帧布置为当前和最近活动事务的集合隧道信息的经交错片段的单个堆,从而允许活动事务保持彼此隔离。可在单个大存储写入请求中写入含有所有片段的整个堆,从而允许多个事务在单个循序存储写入请求内存留其状态;使较大数目的事务能够同时操作。
鉴于上文,将了解,大量事务可保持隔离且同时操作,且以最小存储写入请求在存储装置中存留。
鉴于上文,将了解,堆文件和帧文件的分离允许堆文件以最小的写入等待时间定位在存储介质上,使得事务能够在最短可能时间内持续其状态。
每一堆文件对应于单个时间帧,且当时间移动越过绝对时间帧边界时,新的堆打开。当这发生时,先前堆被认为关闭,且可能不再被附加。
当事务关闭时,与所述事务有关的所有片段被视为存在于对应于事务关闭的时间帧内,与片段何时被创建或事务何时首次被打开无关。
在一个实施例中,一旦堆文件的时间帧已期满且与关闭的事务有关的关闭的堆文件中的片段立即迁移到对应的帧文件。
在另一实施例中,一旦堆文件的时间帧已期满就关闭堆文件,且保持堆文件,直到已累加足够的事务片段为止;因此,所有关闭的堆文件中与关闭的事务有关的片段迁移到对应的帧文件。
创建堆文件内的事务片段,且将其指派给已经打开的事务。在打开的事务内,可任意地创建或反演跨任何数目的集合路径的任何数目的集合例项。其后,可舍弃或应用事务。
当舍弃事务时,通过将其所指派的事务标记为被舍弃来逻辑上舍弃在事务的环境内创建的所有事务片段。当应用事务时,如此标记事务,且当前堆文件内的所有事务片段持续存储,与其事务状态无关。
仅将与所应用的事务有关的事务片段迁移到帧文件。因此,所有帧文件仅含有所应用的事务单元,且可被视为可用于所有查询运算符。
鉴于上文,将了解,事务隔离或读取一致性同步活动中不涉及导览帧文件的运算符,因为所有帧文件的事务环境是静态的,且仅需要在堆文件导览期间考虑事务隔离。
在此实施例中,所有集合路径;集合路径内的元素路径;以及路径和帧内的隧道由永不再用且循序地指派的序数唯一地识别,以避免错失序数。始终使用这些序数来寻址路径和隧道,以允许存取结构为密集且连续的。
在此实施例中,集合和元素路径的序数用于目录和文件名称内,而不是其对应的路径名称内,以允许路径名称在元数据内任意地改变,且不会对存储系统造成不当影响。
要求存储结构存留序数、集合路径、元素路径和元素意图的定义。在此实施例中,这些定义维持在存储器中,且当定义改变时,完整的路径定义集合也在新的且单独的元数据文件内存留在存储装置上。每一元数据文件名称包含严格单调增加的版本编号以及更新时的时间帧编号。这些识别符也出现在文件的内容内。
数据定义命令无法完成,直到新的元数据文件已成功写入且同步到存储装置为止。
有利的是,在此实施例中,通过找到在其名称中具有最高版本编号以及其内具有一致版本编号的元数据文件来恢复过程失败。
鉴于上文,将了解,可删除对应于在保持在所有集合路径中的最老帧之前的帧的元数据文件。
鉴于上文,将了解,如果数据库的内容需要恢复到前一时间帧,那么可简单地删除含有后续帧编号的所有帧、堆和元数据文件。
鉴于上文,将了解,在任一时间点可动态地且任意地引入集合路径和元素路径,且无限期地保持其对应的定义。
帧文件结构
将每一关闭的帧布置为存储扇区层级,其中每一扇区与一特定实体路径(集合或元素)有关,且由多个子扇区组成,且其中每一子扇区与特定隧道有关。
如图17中所示布置所述层级。
连续的存储每一扇区,且每一较高等级扇区在层级中的下部的下一等级处含有到所围入的子扇区的扇区图。用于子扇区的扇区图位于超扇区的开始处。
将这些扇区图布置为固定大小条目的一维阵列,其含有每一子扇区序数的子扇区的开始地址,如图18中所示。
通过考虑偏移量N来寻找子扇区N的地址。可从后续条目确定子扇区N的大小,因为扇区是连续存储的。
为了到达元素路径E中的隧道T,需要经由元素路径扇区图和隧道扇区图进行导览。
每一隧道在其开始处含有隧道链接,以将所述隧道链接到其在先前帧中的对应隧道。隧道链接允许越过帧沿隧道导览,而无需访问每一帧中的扇区图。因此,如图19中所示将每一隧道布置为具有固定大小帧编号和固定大小隧道地址,其分别识别帧以及帧文件内的地址,在其中隧道继续。
堆文件结构
事务片段累加在堆文件内。堆文件具有在需要更多空间时延伸的水印。每当应用一个或一个以上事务时,就将堆文件的内容同步回到存储装置(直至水印)。
将直至水印的堆空间布置为离散的固定长度集合隧道片段,其中片段相互链接以形成事务内的片段链。通过添加一个或一个以上片段来延伸堆水印。
每一事务片段属于一个事务。随着事务添加集合隧道单元,其将一个或一个以上片段添加到所述链。
每一片段含有一标头,其识别其所属的集合路径和事务。每一片段还含有指向链中的下一事务片段的指针以及指向同一集合路径中的下一片段的指针,如图20中所示。
与事务片段有关的事务信息存储在堆文件的标头内。图21说明单个堆文件的结构。
每个集合路径链和事务链的头部维持在存储器中。因此,有可能找到与特定事务有关的所有片段或与特定集合路径有关的所有片段。
链标头和片段指针两者含有帧编号和片段编号,其中帧识别片段所属的堆文件的帧编号,且片段编号识别片段在堆文件内的序数位置。在此实施例中,事务片段链能够延伸越过堆文件,以允许通过跟随单个链来定位属于单个集合路径或事务的片段。
鉴于上文,将了解,堆文件的结构允许论断运算符在搜索与之相关的信息时迅速地导览堆存储装置。
鉴于上文,将了解,所述片段含有数据库从过程失败恢复应需要的充足信息,以便能够重构存储器中链标头。
在堆文件已关闭之后,将与所应用的事务有关的片段迁移到帧文件中。必须保持堆文件直到其内的所有所应用事务片段均已迁移为止;其后可删除堆文件。
当操作者扫描堆文件和帧文件两者时,其忽略具有对应于先前扫描的堆文件的编号的任何帧文件。
鉴于上文,将了解,在移除堆文件之前,可创建帧文件并将其安全地同步到存储装置,以确保在任一给定时间,每个集合例项安全地存在于堆文件和帧文件中的一个或另一个或两者中。
长运行事务可含有多个堆文件中的事务片段。当事务最终关闭时,必须访问打开和关闭帧之间的堆文件以将事务片段迁移到帧文件中。
事务管理
对同时打开的事务的数目存在上限,且存在固定的一组再循环的唯一事务句柄。事务句柄保持活动,直到事务已关闭(被放弃或应用)且堆文件已关闭为止。在当前帧期满时或在需要收回事务句柄时,堆文件关闭。
事务句柄池维持在存储器中,以允许自由句柄的快速事务检查和分配。
事务句柄的有用上限为65535。
当数据库系统停止(不管出于什么原因)时的任何打开事务均被视为被放弃。当数据库系统开始或重新开始时,创建新的堆文件,且收回所有事务句柄并使其可用于再用。打开的事务无法持续超过存储引擎关闭。
每一论断运算符在打开事务的环境内导览片段,且运算符扫描片段需要知道外来事务状态,且依据正遵守的精确事务语义而跳过或包含对应于外来事务的片段的内容。
在反演一个或一个以上集合例项之前,事务必须识别哪些集合例项可反演,且获取每一个上的独有反演锁。未被授予反演锁的事务必须立即等待锁被获取,且如果在所定义的时间周期内尚未授予所述锁,那么事务必须释放其已经获取的所有反演锁,以解决潜在的死锁。其后,事务必须被放弃,或重复识别并锁定可反演的集合例项的尝试。
在其中许多事务为活动且寿命短从而导致频繁事务应用的大并发用户环境中,以预定义间隔提供藉以应用事务的循环是有用的。希望应用的任何事务等待下一可用应用循环,且在应用循环已完成之前无法继续。虽然这可能延迟个别事务,但不会使吞吐量降级,因为非常多的事务可同时完成。
应用循环的有用间隔为10ms。这合理地限制对存储装置的写入请求的数目,且向等待应用的事务提供可忽略的延迟。
如果没有事务正在等待应用,那么跳过应用循环。
在一个实施例中,应用循环的持续时间由当前活动的事务的数目决定,使得如果仅存在一个活动事务,那么此持续时间为零,且此持续时间随着打开事务的数目而增加,直至所定义的最大时间。
鉴于上文,将了解,可使用单个或最小数目的大存储写入请求来应用多个事务并将其同步到存储装置,藉此通过利用当代存储系统所提供的高数据传送速率来提供良好的事务吞吐量。
当每一打开事务首次打开时,为其指派串行化编号,其中此编号比所有当前打开的事务的最大串行化编号大一。当无其它事务打开时,此串行化编号为1。事务串行化编号用以确保运算符遵守查询所需的事务语义。
当查询不需要与其它打开事务隔离时,其可包含遇到的所有打开事务。
当查询不需要与其它所应用事务隔离时,其可包含遇到的所有所应用事务。
当查询需要与自查询开始以来所应用的事务隔离时,其可忽略具有比查询开始时的最高串行化编号高的串行化编号的事务。
当查询需要与自查询事务开始以来所应用的事务隔离时,其可忽略具有比查询事务开始时的最高串行化编号高的串行化编号的事务。
鉴于上文,将了解,可提供多种事务隔离模式,且可同时支持多种事务隔离模式。
鉴于上文,将了解,任何额外机构无需在多个同时打开事务的环境内解析单独事务状态。
帧图
帧内的每一元素路径含有一帧图,其总结先前帧上的元素路径的元素例项的总体。将此图布置为在一个维度中由标度且在另一维度中由间隔寻址的二维阵列。所述阵列中的每一条目含有根据路径类型而变的路径的总结信息。
帧图中标度的数目S和间隔的数目I在所有元素路径上是固定的。
在标度s(其中s<S)下,每一条目与大小为I^s的帧间隔有关。
举例来说,对于标度4和间隔8;
在标度0下,每一间隔涵盖1个帧;
在标度1下,每一间隔涵盖8个帧;
在标度2下,每一间隔涵盖64个帧;
在标度3下,每一间隔涵盖512个帧;
总的来说,此图可涵盖4096个帧(8x512)。
选择标度和间隔的数目,使得I^S大于待保持的时间帧的数目。对于标度和间隔,有利值分别为4和256。这允许保持超过40亿个数据时间帧。
如下针对标度s和时间帧F得出帧图中的间隔数i:
i=(F/(I^s)模I),s在0..(S-1)中;其中S为标度的数目,且I为间隔的数目。
当越过每一帧边界时,
在0..S-1中的每个标度s下,针对间隔i设定当前帧F的帧图条目。
如果在标度s(其中s>0且s<(S-1))下,间隔i=0,那么对于小于s的所有标度,使用于每个间隔(0..I)的图条目复位。
将用于新帧的帧图初始化为与就在之前的帧相同。
帧图操作为累加器,且从先前帧复制到每一新帧中。
帧图用以通过排除被视为不相关的帧来在帧上导览。
在每一所访问的帧内,运算符咨询帧图来确定下一相关帧。通过减小间隔编号(从当前访问的帧编号)且增加标度(因为每一标度均被用尽)(当标度下的所检查间隔的数目达到最大间隔数目时)来咨询图间隔。当找到相关间隔时,接下来访问所述间隔和标度内的第一帧编号。
以下实例展示在帧191和192处具有标度4和间隔4的帧图的覆盖范围。标度与间隔的每一交叉显示所述交叉处所提供的帧覆盖范围。在帧191与192之间改变的单元已突出显示。
在帧191处,帧图具有S=4;I=4。
表35:
|
间隔 |
|
|
|
标度 |
0 |
1 |
2 |
3 |
0 |
188 |
189 |
190 |
191 |
1 |
176->179 |
180->183 |
184->187 |
188->191 |
2 |
128->143 |
144->159 |
160->175 |
176->191 |
3 |
1->63 |
64->127 |
128->191 |
- |
在帧192处,帧图具有S=4;I=4。
表36:
|
间隔 |
|
|
|
标度 |
0 |
1 |
2 |
3 |
0 |
192 |
189 |
190 |
191 |
1 |
192 |
180->183 |
184->187 |
188->191 |
2 |
192 |
144->159 |
160->175 |
176->191 |
3 |
1->63 |
64->127 |
128->191 |
192 |
识别元素帧图
用于识别元素路径的每一帧图含有关于元素例项值内的哪些位被帧间隔内的所有元素例项共用的信息。如果帧间隔中的共用位不与正搜索的身份的值中的位对应,那么从连接隧道搜索忽视所述帧间隔。
帧图中的每一条目包括与最长可能识别元素例项一样长的两个位序列,
共性掩码M
共性序列B
掩码M含有设定位,其中间隔内的所有元素例项中的对应位始终被设定或始终被清除。B中的对应位指示所述位始终被设定还是始终被清除。举例来说,如果元素路径中的位的最大数目为8,那么M=0暗示所有位均不同,而M=1和B=1暗示对于所述间隔中的元素例项,最低有效位始终被设定。
当将每一元素例项E添加到帧时,如下更新位模式M和B,
如果这是帧的第一元素例项,那么B变为E,且所有位在M中均被设定。
否则,如果(EANDM)=(BANDM),那么不改变M或B;
否则得出以下
差异D=NOT((EANDM)XOR(BANDM))
M变为(MANDD)
B变为(BANDD)
如果(CANDM)不等于(BANDM),那么当搜索等效于候选身份C的识别元素例项时,排除帧间隔。
测量元素帧图
用于测量元素路径的每一帧图条目含有关于帧间隔上的最小和最大元素例项值的信息。如果帧间隔界限不与正搜索的界限重叠,那么从组合隧道搜索忽视所述帧间隔。
每一帧图条目针对间隔中的所有元素例项含有两个值,
元素最小值N,其表示间隔上的最小元素例项值
元素最大值X,其表示间隔上的最大元素例项值
当将每一元素例项E添加到帧时,如下更新值N和X,
如果这是帧中的第一元素,那么N和X均设定为E
否则,如果E>X,那么X设定为E
否则,如果E>N,那么N设定为E
如果(B<N)OR(A>X),那么当在最小值A与最大值B的界限范围内搜索测量元素例项时,排除帧间隔。
枚举元素帧图
枚举元素路径中的每一帧图条目含有T个位的序列,其中对应于每一性质隧道存在一个位。
当将每一元素例项E添加到帧时,如下更新位序列,
如果这是帧中的第一元素,那么首先清除所有位
对于针对此元素例项含有真单元的每一隧道t,设定对应于隧道t的位。
如果位P在T中被清除,那么当搜索含有性质P的枚举元素例项时,排除帧间隔。
集合路径帧图
还针对集合隧道帧内的每一集合路径维持帧图。
用于集合路径的每一帧图条目含有两个数目,
集合隧道的计数C
集合反演的计数D
这些数目如下维持,
如果这是正添加到帧的第一例项,那么其对于未经反演的集合设定为C=1;D=0,且对于经反演的集合设定为C=1;D=1。
否则,C针对所添加的每一集合而递增;且C和D两者针对每一反演而递增。
这些计数用以评定在帧间隔内是否将需要解析反演,且用于推断元素路径隧道内的所累加隧道中的帧边界。
单元
每一隧道包括一序列单元。单元的结构根据所述单元在其中出现的隧道族以及其支持的运算符而变化。下文描述所使用的单元类型。
识别单元
这表示用于集合隧道内的单个集合例项的识别元素的整个例项。这是具有先前单元大小、路径和域的字节序列,如图22中所示。
所述路径识别元素例项所属的元素路径。
域表示用以对识别符进行编码的编号系统或字符组。
当且仅当识别元素单元具有与候选值相同的长度、编码域和字节序列时,识别元素单元才被视为等效于候选识别符。
这种类型的单元用以存储和从单个集合例项检索识别元素例项的值。
测量单元
这表示用于集合隧道内的单个集合例项的测量元素的整个例项。测量单元保持表示元素的量值的单元长度、域、正负号识别符、指数以及有效数,如图23中所示。
路径识别元素例项所属的元素路径。
所述域定义用以对原生值进行编码的编号系统或时区。
正负号指示量值为正还是负。
指数定义必须使有效数移位多少个位来标准化为固定基数点。
有效数仅含有充足位或字节来表示测量的量值的精度。
通过检查其相对量值,将测量单元与候选测量进行比较。比较必须假定共用偏移量和标度以执行一致比较。举例来说,在具有表示原始时区的域的标准UTC中表示时间值。
这种类型的单元用以存储和从单个集合例项检索测量元素例项的值。
枚举单元
这表示用于集合隧道内的单个集合例项的枚举元素的整个例项。这是各自之前有性质大小的性质识别符序列以及之前有单元大小、路径和域的枚举序列,如图24中所示。
路径识别元素例项所属的元素路径。
域定义用以对原生性质值进行编码的编号系统或字符组。
如果域编码相同且性质序列含有相同大小和字节序列的性质,那么将枚举单元视为含有候选性质。
这种类型的单元用以存储和从单个集合例项检索枚举元素例项的值。
不透明单元
这表示到用于集合隧道内的单个集合例项的不透明元素的整个例项的链接。不透明单元含有单元大小、路径、域、不透明元素大小,以及到不透明数据存储之处的链接,如图25中所示。
路径识别元素例项所属的元素路径。
域定义用以将不透明值存储在链接位置处的编码系统。
元素大小指定链接位置处所含有的不透明对象的大小。
链接表示存储不透明元素例项的内容的位置。将不透明元素视为大数据对象(例如文档),且存储在例如文件等外部位置处。有用地,链接可为URL。
这种类型的单元用以从单个集合例项检索不透明元素例项的值。
反演单元
这表示集合隧道内先前创建的集合例项的反演。此单元含有固定大小的帧和隧道编号,如图26中所示。
经反演的帧以及经反演的隧道编号指代已经反演的集合例项的位置。反演隧道编号指代当前帧中的反演单元的隧道位置。
这种类型的单元用以指示集合隧道内的集合例项的反演。
摘要单元
这表示连接隧道内的识别元素的部分例项。每一单元含有单元大小、摘要和固定大小隧道编号,如图27中所示。
从识别元素例项的域和字节序列计算摘要,且隧道编号指代含有供计算摘要的相应集合例项的集合隧道。
这种类型的单元出现在识别元素路径中的每一元素例项的连接隧道中,且由IS运算符用以评估元素例项与运算符操作数之间的等效性的可能性;藉此,将与运算符操作数的摘要等效的单元摘要视为可能等效性;或否则的话为不可能的。
所计算的摘要为用于低于某一大小的识别元素例项的识别元素本身的值。在此情况下,将元素例项的等效性视为确定的而不是仅仅为可能的。
对于在大小阈值处或高于大小阈值的元素例项,可从例如MD5等行业标准摘要算法计算摘要。
在每种情况下,从组合的域和识别字节序列得出摘要。
秩单元
此单元含有来自固定精度且固定基数点的测量且不具有正负号的单个无正负号字节。举例来说,可将测量标准化为2048位的精度,其在紧接第1024个位之后具有固定基数点。将此划分为秩1..256的256个秩单元,其中秩1为最高有效秩。
这种类型的单元出现在测量元素路径中的每一元素例项的组合隧道中,且由IN运算符用以评估元素例项正由运算符操作数定界的可能性。所述单元也由聚集操作用以累加元素例项值的部分。
布尔单元
这是含有指示符真或假的固定大小单元。以其最有效形式,此单元为在设定时指示真的单个位。这种类型的单元由HAS和EXISTS运算符分别用以确定性质或元素例项的存在。所述单元出现在下文所述的多个隧道类型中。
隧道
下文描述在每一隧道族内创建的隧道。
集合隧道
针对每一集合路径创建以下集合隧道。
针对每个所创建的集合例项,存在一个所创建的集合隧道。此隧道对于集合例项内的每一元素例项含有一个单元。每一单元为识别单元、测量单元、枚举单元或不透明单元类型之一。
针对逻辑移除的每个集合例项,存在一个所创建的集合隧道。此集合隧道含有一个反演单元接着是从已被认为移除的集合例项复制的每元素例项一个单元。
创建这些隧道的次序反映创建和移除集合例项的次序,且每一帧中的这些隧道的数目将变化。针对新帧以从1开始的严格递增次序指派集合隧道的隧道编号。
每帧存在正好一个反演隧道。此隧道对于每个反演集合隧道含有一个反演单元。此隧道始终被指派隧道编号0。
连接隧道
针对每一识别元素路径创建以下连接隧道。
每帧存在固定数目(N)个摘要隧道,其中每一摘要隧道含有零个或零个以上摘要单元。
对于此帧中的此元素路径中的每个识别元素例项,创建一摘要单元,其中从元素值的域和字节序列计算所述摘要,且将对应集合隧道的隧道编号指派给此摘要单元。将摘要单元指派给由散列函数给出的摘要隧道,散列函数映射到1..N,且从元素值的域和字节序列计算。
如图28中所示,将每一摘要隧道布置为具有在每一隧道内以严格年月日次序附加的单元。
连接隧道由IS运算符遍历以评估元素例项与运算符操作数的等效性的可能性或不可能性。在单元具有与运算符操作数的摘要相同的摘要的情况下,那么等效性被视为可能的;否则其被视为不可能的。
在摘要单元足够小且由元素例项组成时,那么等效性被视为确定的,而不是可能的。
每帧正好存在一个存在隧道。此隧道针对对应帧中的每个集合隧道含有一个布尔单元,且指示用于此元素路径的元素例项是否存在于对应的集合隧道中。此隧道始终被指派隧道编号0。
每一帧含有在存在隧道中为真的布尔单元的计数。
每一帧还含有每摘要隧道编号的单元计数。存在由隧道编号(1..N)寻址以得出所述隧道中的单元的计数的一维阵列,如图29中所示。
每一集合例项仅出现在一个摘要隧道中。因此,针对识别元素的每一帧内存在一摘要隧道图。此图为由集合隧道编号寻址以得出对应的摘要隧道编号的一维阵列,如图30中所示。
摘要隧道图对于帧中的每个集合隧道含有一个条目。在对应元素例项不存在于集合隧道内的情况下,摘要隧道编号设定为0。
为了为集合例项找到摘要单元,需要对照集合隧道编号检查摘要隧道图以找到摘要隧道,且接着检查所述摘要隧道中的摘要单元以找到对应的集合隧道编号。
为了找到对应于识别值的集合例项,需要计算摘要和摘要隧道编号,以为所计算的摘要计算所有的匹配摘要单元。
N的有效数目为65535。
组合隧道
针对每一测量元素路径创建以下组合隧道。
每帧存在固定数目(N)个秩隧道,其中每一秩隧道含有零个或零个以上秩单元。
对于此帧中的此元素路径中的每个元素例项,创建N个秩单元,其中秩隧道N中的单元表示标准化测量表示中的秩N。每一单元在秩隧道中的位置与含有此单元的元素例项的集合隧道编号对应。
如图31中所示,将每一秩隧道布置为具有在每一隧道内以严格年月日次序附加的单元。
每帧存在正好一个正负号隧道。此隧道针对对应帧中的每个集合隧道含有一个布尔单元,且指示用于此元素路径的元素例项是否在对应的集合隧道中具有负量值。此隧道始终被指派隧道编号N+1。
组合隧道由IN运算符遍历以计算元素例项正由运算符操作数定界的可能性或不可能性。在正负号单元或秩单元具有无法落在运算符界限内的值的情况下,那么将定界视为不可能的;否则将其视为可能的。对于可能定界,IN运算符可进一步检查秩单元以寻找相同元素例项,以进一步确定不可能性或确定性。
每帧存在正好一个存在隧道。此隧道针对对应帧中的每个集合隧道含有一个布尔单元,且指示用于此元素路径的元素例项是否存在于对应的集合隧道中。此隧道始终被指派隧道编号0。
每一集合例项在每个组合隧道内出现一次。
每一帧含有在存在隧道中为真的布尔单元的计数。
每一帧还针对每个秩隧道针对每个可能的无正负号单元值含有一单元计数。这是由字节值(0..255)寻址以得出所述秩隧道中含有对应的单元值的单元的计数的每秩隧道一个一维阵列,如图32中所示。
单元计数直接用于总结目的,其中存在共用正负号,且帧上无反演,且无论断运算符。在这些情况下,将每一字节值乘以对应的单元计数,且将这些相对于秩进行组合。
在其它情况下,聚集又对每一秩隧道作用以最小化高速缓冲存储器搅动。为了合计,单独地对每一秩(与对应的正负号单元)求和,且组合这些和以获得累加结果。最小值和最大值使用正负号隧道来确定寻找哪一正负号以及是寻找最小还是最大量值;接着首先扫描含有非零单元值的最高秩隧道,以找到候选单元;其后通过直接以候选次序咨询对应的较低秩隧道且接着递减秩次序来减少候选者。
为了找到对应于测量值的集合例项,需要扫描相关的正负号和秩隧道。找到的每一单元的位置对应于集合隧道编号。
为了找到用于集合例项C的秩R处的字节的值,要求检查隧道R中位置C处的单元。
当在定界范围内搜索测量时,比较低界限与高界限的秩字节以确定其中界限不同的最高秩。这是决定性秩,且仅需要首先通过扫描高于决定性秩的秩来检查决定性秩下方的秩隧道,以寻找被识别为具有可能相关性的特定集合例项。
鉴于上文,将了解,可在无需检查所有秩隧道的情况下,将许多单元视为具有不可能相关性。
在扫描之前咨询在决定性秩值上方的秩的单元计数,以快速确定对应的秩隧道中是否存在所需的秩值。如果不存在,那么忽视整个帧。
N的有效数目为256,其提供2048个位的精度。
特性隧道
针对每一枚举元素路径创建以下特性隧道。
每帧存在固定数目(N)个性质隧道,其中每一性质隧道含有零个或以上布尔单元。
对于此帧中的此元素路径中的每个元素例项,将枚举单元附加到每个性质隧道。
针对枚举元素内的每一性质且针对性质散列计算所返回的每一性质隧道编号计算从性质域和字节序列映射到1..N的散列函数,设定所述隧道中的单元,否则清除所述单元。
在有用的替代实施例中,将单调增加的序数指派给每一唯一性质识别符。通过将模数N应用于性质序数来得出隧道编号。
在另一有用替代实施例中,将单调增加的序数指派给每一元素路径内的每一唯一性质识别符。通过将模数N应用于性质序数来得出隧道编号。
特性隧道由HAS运算符遍历以评估元素例项拥有性质的可能性或不可能性。在单元指示拥有的情况下,那么拥有被视为可能的;否则其被视为不可能的。
在从性质序数得出隧道编号,如果(M-N)<P<2N,其中P为性质识别符的序数,M为所指派的最大序数,且N为隧道的数目,那么拥有被视为确定的而不是可能的。
每一单元在性质隧道中的位置与含有对应元素例项的集合隧道的隧道编号对应。
每帧存在正好一个存在隧道。此隧道针对对应帧中的每个集合隧道含有一个布尔单元,且指示用于此元素路径的元素例项是否存在于对应的集合隧道中。此隧道始终被指派隧道编号0。
每一集合例项在每个隧道内出现一次。
每一帧含有在存在隧道中为真的布尔单元的计数。
每一帧还含有每枚举隧道的真单元的计数。这是存在由性质隧道编号(1..N)寻址的一维阵列以得出所述隧道中的真单元的计数,如图33中所示。
N的有效数目为65535。
隧道实例
下文提供用于早先描述的职员表的单元和隧道的存储布局的实例。将单元说明为围入方括号中;将单元大小展示为S,且将域展示为D。为了清楚起见,假定所有职员集合例项存在于同一时间帧内,且尚未删除任何职员例项。
表37:职员表格
姓名 |
职员编号 |
工资 |
佣金率 |
部门编号 |
西蒙·史密斯 |
10 |
10000 |
|
100 |
约翰·琼斯 |
20 |
20000 |
10.00% |
200 |
鲍勃·布朗 |
30 |
30000 |
15.00% |
200 |
表38:
集合路径 |
集合路径编号 |
职员 |
1 |
部门 |
2 |
区 |
3 |
表39:
元素路径 |
元素路径编号 |
集合路径编号 |
意图 |
姓名 |
1 |
|
枚举 |
职员编号 |
2 |
|
识别 |
工资 |
3 |
|
测量 |
佣金率 |
4 |
|
测量 |
部门编号 |
5 |
|
识别 |
表40:集合路径1
表41:元素路径1
表42:元素路径2
连接隧道编号 |
连接隧道 |
0(存在) |
[1][1][1] |
… |
|
散列(10) |
[S,digest(10),1] |
散列(20) |
[S,digest(20),2] |
散列(30) |
[S,digest(30),3] |
|
|
65535 |
|
表43:元素路径3
组合隧道编号 |
组合隧道 |
0(存在) |
[1][1][1] |
1(秩1) |
[1][2][3] |
2(秩2) |
[0][0][0] |
3(秩3) |
[0][0][0] |
4(秩4) |
[0][0][0] |
5(秩5) |
[0][0][0] |
(基数点) |
|
6(秩6) |
[0][0][0] |
7(秩7) |
[0][0][0] |
8(秩8) |
[0][0][0] |
9(秩9) |
[0][0][0] |
10(秩10) |
[0][0][0] |
11(正负号) |
[+][+][+] |
表44:元素路径4
表45:元素路径5
连接隧道编号 |
连接隧道 |
0(存在) |
[1][1][1] |
… |
|
散列(100) |
[S,digest(100),1] |
散列(200) |
[S,digest(200),2] |
散列(300) |
[S,digest(200),3] |
… |
|
65535 |
|
下文提供实例运算符导览路由
EXISTS(“职员.佣金”),遵循元素路径4中的存在隧道0。这得出集合隧道编号2和3。
IS(“职员.职员编号”,10),遵循由元素路径2中的散列(10)给出的摘要隧道。这得出集合隧道编号1。
IN(“职员.工资”,0,10000),遵循元素路径3中的正负号隧道11和秩隧道1。这得出集合隧道1。
HAS(“职员.姓名”“西蒙”,“琼斯”),遵循且组合由元素路径1中的散列(“西蒙”)和散列(“琼斯”)给出的性质隧道。这不得出集合隧道。
隧道压缩
通常使用常规无损运行长度编码来压缩所描述的隧道中的许多隧道,以减小隧道大小且使隧道的扫描较快。在别处无遗漏地涵盖运行长度编码方法,且因此此处不进一步论述。
存在和性质隧道有效地为位序列,其中设定或清除位的连续子序列是可能的。因此,这些隧道有用地经运行长度编码。
在用于测量元素的秩隧道内,给定秩处的字节值可能是类似的,尤其是在距基数点极端距离处,其中将存在大量的零字节值。因此,秩隧道有用地经运行长度编码。
集合组
所定义的论断和绑定运算符中的每一个产生并操纵集合例项成员的集合组。
每一集合组是通过论断运算符评估产生,且含有被视为与运算符评估相关的每一集合例项的以下信息,
集合帧和集合隧道编号,其唯一地识别被视为与论断运算符评估相关的集合例项;
论断运算符评估的确定性。布尔指示符,其由论断运算符评估指派以指示集合例项与论断运算符评估的相关性的确定性或可能性;
访问序数,其在绑定操作期间指派,且通过论断运算符评估指派为零;
序列编号,其在绑定操作期间指派,且通过论断运算符评估指派为零;
基数,其在绑定操作期间指派,且通过论断运算符评估指派为一;
摘要隧道编号,其在绑定操作期间指派,且通过论断运算符评估指派为零;
成员在集合组内的序数位置,且其通过论断运算符评估递增地指派;
集合例项的绑定元素例项的摘要单元的摘要值。所述摘要值是在绑定操作期间指派,且通过论断运算符评估指派为零。
在由论断运算符产生之后,每一集合组将展现良好的帧地点,且集合例项将在每一帧内排序。
有利的是,集合组托管在存储器中,以辅助快速存取,且用于集合组的有利结构是固定大小的存储器块的列表。这在图34中说明。
有利的是,汇集未用的存储器块以允许集合组的快速构造,而无需在操作系统等级下调用低等级存储器分配服务。
有利的是,随着绑定操作进行,将仅含有与绑定过程的当前和后续阶段无关的成员的任何块从列表中移除,且返回到未用存储器块的池。
使用集合组通过存取组合和/或集合隧道来物质化查询结果。每一集合成员的确定性指示符由查询物质化用以确定是否有必要检索元素例项以解析不确定性。
数据库进程
上文所定义的存取模型和存储结构用以将数据存留在存储装置内,数据库内的存储装置检索查询结果。所述数据库的架构由图35中所说明的层和组件组成。
三个主要层由数据库引擎A组成,数据库引擎A负责原生数据模型(例如关系模型)和原生命令语言(例如SQL)的环境内的用户命令的总体协调。模型事务层B负责原生数据模型与存储引擎C所使用的存取模型之间的转换。存储引擎C负责存留路径定义的改变,且存留对集合例项的改变,且负责检索查询所需的集合和元素例项。
由模型转化B提供给数据库引擎A的接口取决于数据库引擎A所支持的原生数据模型。对于关系数据模型,在一个有用实施例中,此接口如下。
模型转化接口
表46:
由存储引擎C提供给模型转化层B的接口支持存取模型操作和运算符。在一个有用实施例中,此接口如下
存储引擎接口
表47:
命令由用户接口A1以原生语言接受,且由原生语言剖析器A2剖析。
涉及对原生纲要的改变的命令更新纲要定义A4,且通过模型转换B传递到实体转换B1中,以从原生实体转换为存取模型实体。涉及对集合路径和/或元素路径定义的纲要改变传递到存储引擎C中以供路径定义C1存留。将任何公布的纲要约束传递到实体转换B1中,以允许其确定所定义的每一元素路径的意图。
涉及事务更新的命令通过命令执行A5且通过模型转化B,经由实体转换B1、操作转换B2以及数据类型转换B3进入存储引擎C中,且经由路径定义C1进入存储结构C6中。在通过期间,实体转换B1将原生数据模型实体转换为集合和元素路径实体;路径定义C1解析集合和元素路径身份;操作转换B2将任何集合例项更新转换为存取模型集合例项反演和创建操作;数据类型转换B3将原生数据类型转换为用于识别、测量、枚举和不透明元素例项的存取模型数据类型。
涉及查询的命令通过命令执行A5且通过模型转化B,经由实体转换B1、操作转换B2、数据类型转换B3、运算符转换B4、路径定义C1、表达式重构C2、运算符提取C3以及操作绑定C4、检索与合并C5而进入存储引擎C中。在通过期间,实体转换B1将原生数据模型实体转换为集合和元素路径实体;操作转换B2将任何复合查询语句转换为其组件查询;数据类型转换B3将原生数据类型转换为用于识别、测量、枚举元素和不透明例项的存取模型数据类型;运算符转换B4将所有原生语言运算符转换为存取模型运算符(IS、IN、HAS、EXISTS和BIND)。存储引擎C使用:路径定义C1来解析集合路径名称和元素路径名称;表达式重构C2来将复合布尔表达式转换为析取范式形式;结合从存储结构C6的运算符提取C3,产生每一运算符的集合组;结合运算符绑定C4,绑定来自合取项中的运算符的集合组;结合检索与合并C5,其经由存储结构C6检索且合并来自所有被绑定的集合组合结合的所有结果。查询结果返回通过操作转换B2以用于任何聚集和表达评估操作,且接着通过数据类型转换B3以用于将存取模型数据类型转换为原生模型数据类型。这些结果最终传递回到呈现A3,以为起始所述查询的用户进行最终渲染。呈现A3负责所呈现结果的最终分类和排序。
在查询执行期间,运算符转换B4向操作执行B2指示任何潜在有损论断运算符转化,操作执行B2可选择请求所论断的元素例项以及所寻找的结果组,使得其可检验通过应用原始运算符准则而返回的结果,并对因有损转化而产生的结果进行过滤。
约束(例如域定义)在原生纲要定义A4内定义,且在数据库引擎A内由命令执行A5强制执行。命令执行A5将如上文所述发出查询,以在强制执行唯一性和逻辑关系约束时确定实体的存在或不存在。
下文是结合关系数据库的上下文而描述,但类似地应用于所描述的存取模型所支持的任何其它数据模型。
当用户使用SQL语言经由A1提交命令以创建新的数据库例项时,通过A2将SQL语句剖析为其语言组件,其中提取数据库名称和数据库位置。数据库引擎将检验其为有效命令,且相应地经由A4更行纲要定义。使数据库和位置名称传递通过B1,以用于将存储位置路径到处到存储引擎C中,其中为新的数据库例项创建新的文件系统目录,且在C6内创建子目录和元数据文件。
当用户使用SQL语言经由A1提交命令以创建打开现存数据库例项时,通过A2将SQL语句剖析为其语言组件,其中提取数据库名称。数据库引擎将在A4中使用其纲要定义检验其为有效命令。使与A4中的数据库名称相关联的位置通过B1,以用于将存储位置路径导出到存储引擎C中,其中将文件系统目录指派给用户,且将最新元数据文件从C6加载到存储器中。
当用户使用SQL语言经由A1提交丢弃现存数据库例项的命令时,SQL语句由A2剖析为其语言分量,在其中提取数据库名称。数据库引擎将使用A4中的其纲要定义确认其为有效命令。与A4中的数据库名称相关联的位置传递通过B1,以用于导出到存储引擎C中的存储位置路径,其中从C6内删除文件系统目录、其子目录和内部所含的文件。
当用户提交使用SQL语言经由A1创建表结构的命令时,SQL语句由A2剖析为其语言分量,在其中提取表和列名称。数据库引擎将确认其为有效命令且经由A4相应地更新纲要定义。表和列名称连同列数据类型和约束一起传递到模型转化B中。其中,表名称(包含任何纲要和数据库限定符)解译为集合路径;每一列名称解译为元素路径;每一约束用于确定B1的元素路径意图。集合路径、元素路径和元素路径意图传递到C1,其中向集合路径指派唯一集合路径序数,且向每一元素路径指派集合路径内的唯一序数。由C6在每一隧道族目录内创建新集合路径的文件系统目录。数据库元数据存留于在C6内。
当用户提交使用SQL语言经由A1将一个或一个以上列添加到现存表结构的命令时,SQL语句由A2剖析为其语言分量,在其中提取表和列名称。数据库引擎将确认其为有效命令且经由A4相应地更新纲要定义。分别由B1和从列数据类型及约束导出的元素路径意图将表/列识别符解析为集合路径和元素路径。集合路径、元素路径和元素路径意图传递到C1,其中向元素路径指派集合路径内的唯一序数。数据库元数据存留于C6内。
当用户提交使用SQL语言经由A1丢弃表结构的命令时,SQL语句由A2剖析为其语言分量,在其中提取表名称。数据库引擎将确认其为有效命令且经由A4相应地更新纲要定义。表名称传递到模型转化层B,在其处经由B1识别集合路径。在C6内从文件系统删除与集合路径特定相关的目录和内部所含的所有文件。接着,将集合路径标记为删除,且数据库元数据在C6内持续存在。
当用户提交使用SQL语言经由A1丢弃来自表结构的一个或一个以上列的命令时,SQL语句由A2剖析为其语言分量,在其中提取表和列名称。数据库引擎将确认其为有效命令且经由A4相应地更新纲要定义。表名称和列名称传递到模型转化层B,在其处由B1识别集合路径和元素路径。接着,将元素路径标记为删除,且数据库元数据存留于C6内。
当用户提交使用SQL语言经由A1重命名表结构的命令时,SQL语句由A2剖析为其语言分量,在其中提取旧的和新的表名称。数据库引擎将确认其为有效命令且经由A4相应地更新纲要定义。表名称传递到模型转化层B,在其处由B1依据旧的表名称识别集合路径。其中,在C1中向针对旧名称的集合路径指派新的集合路径名称,且数据库元数据存留于C6内。
当用户提交使用SQL语言经由A1重命名表结构内的列的命令时,SQL语句由A2剖析为其语言分量,在其中提取表和列名称。数据库引擎将确认其为有效命令且经由A4相应地更新纲要定义。表名称和列名称传递到模型转化层B,在其处由B1识别针对旧的列名称的集合路径和元素路径。在C1中向元素路径指派新的列名称,且数据库元数据存留于C6内。
当用户提交使用SQL语言经由A1截短表结构的命令时,SQL语句由A2剖析为其语言分量,在其中提取表名称。数据库引擎将使用A4确认其为有效命令。表名称传递到模型转化层B,在其处由B1识别集合路径。在C6内,删除所有与集合路径相关的帧文件;对集合路径解除指派属于已关闭事务的经截短集合路径的所有事务片段。
当用户提交使用SQL语言经由A1将显式行插入到表结构中的命令时,SQL语句由A2剖析为其语言分量。数据库引擎将经由A4确认其为有效命令,且使列值与列名称相关联。表名称、列名称和列值传递到模型转化层B中,在其处由B1和C1识别集合路径和元素路径。所供应的每一列值由B3根据元素路径意图转换为元素单元(识别、测量、枚举或不透明单元)。在C6内,在当前堆文件中创建一个或一个以上事务片段,且向其添加元素单元。
当用户提交使用SQL语言经由A1询问来自一个或一个以上表结构的行的命令时,SQL选择语句由A2剖析为其语言分量,其将针对每一选择分句创建层级表达树且针对每一地点分句创建层级SQL运算符。这些传递到模型转化层B中。在其中,由B1识别表达树和运算符树中的集合路径和元素路径。由B2将任何复合SQL询问语句重构为不同询问,B2将其作为单独询问提交。对于每一询问,由B4将运算符树中的SQL运算符转换为存取模型的论断和结合运算符且与来自表达树的集合和元素路径名称的列表一起传递到存储层C中,在其处,由C2将运算符树重构为析取范式。随后,由C3针对每一论断运算符产生单独的集合组;接着运算符树的合取项内的集合组在C4中由结合运算符结合。经由C5经由运算符树的每一合取项中的每一集合组从C6取得所需集合路径和元素路径的例项,且所述例项在C5中在运算符树中的合取项之间解除复制并传回到模型转化层B。其中,B2将执行分量询问的任何所需过滤、聚集或重组。这些结果从存取模型数据类型转换回到SQL数据类型,且所述结果传递回到数据库引擎A以供由A3呈现。
当用户提交出于更新或删除行的目的使用SQL语言经由A1询问来自表结构的行的命令时,SQL选择语句由A2剖析为其语言分量,其将创建界定询问的论断条件的层级SQL运算符树。表的名称和运算符树传递到模型转化层B中。在其中,由B1识别集合路径和元素路径;由B4将运算符树中的SQL运算符转换为存取模型的论断运算符。集合路径和运算符树传递到存储引擎C中,在其处,由C2将运算符树重构为析取范式。随后,由C3针对每一论断运算符产生单独的集合组,且其合并在运算符树内的每一合取项内。由C5在运算符树中的合取项之间对集合组解除复制。在处理所述结果之前针对最终集合组的每一成员请求独占反演锁。在用户已选择删除行的情况下,由从其集合隧道检索结果中的每一集合例项且由C5将其复制以创建集合例项反演形式,其中创建一个或一个以上事务片段且所述事务片段附加有反演单元和集合例项元素单元。在用户已选择更新行的情况下,每一原始集合例项如上文描述反演,且接着以经修改元素单元插入新的集合例项,其中在堆文件中创建一个或一个以上事务片段,且向其添加元素单元。
在存储引擎C中独立于所使用的原生数据模型发生以下操作。
当打开事务时,从可用事务句柄的池指派可用事务句柄,且以事务状态(打开)更新堆文件事务标头,但所述标头不写回以进行存储。
当施加事务时,以事务状态(已施加)更新堆文件事务标头,但所述标头不写回以进行存储。事务接着等待下一施加循环完成。释放事务保持的任何反演锁。
当放弃事务时,以事务状态(已放弃)更新堆文件事务标头,但所述标头不写回以进行存储。释放事务保持的任何更新锁。
当施加循环完成时,写入堆文件中的所有新的和经更新的内容且同步回以进行存储。
当集合例项通过事务附加到堆文件时,针对所述事务创建集合隧道。所使用的隧道编号比此堆文件内的同一集合路径的最后集合隧道编号大一。针对集合隧道创建一个或一个以上事务片段,且将对应于每一元素例项值的单元附加到所创建的事务片段。
当集合例项反演形式通过事务附加到堆文件时,针对所述事务创建集合隧道。所使用的隧道编号比此堆文件内的同一集合路径的最后集合隧道编号大一。针对集合隧道创建一个或一个以上事务片段。将一个反演单元附加到所创建的片段,随后是对应于来自原始集合例项的每一元素例项值的单元。
当正在打开事务内的询问的上下文内评估DNF表达时,
对于DNF内的每一合取项,针对所述合取项中的每一论断运算符文字创建集合组,如下文描述。每一运算符可与DNF上的其它运算符同时产生其自身的集合组
同一集合路径假名的所有集合组在每一合取项内合并在一起使得仅保持以所述集合路径中的每个集合组中的相同帧编号和集合隧道编号出现的组成员。
每一合取项内的集合组由出现在同一合取项内的结合运算符结合,如下文描述。一合取项的结合可与其它合取项的结合同时发生。
每一集合组通过序列次序分类。集合组可在DNF上同时分类。
每一集合组用于从对应的集合隧道和/或那些集合组中识别的组合单元检索数据且以序列次序检索。每一集合组的条目在合取项中的所有集合组上同步逐条目检索,且逐条目合并。检索在DNF中的合取项上循序发生,且结果解除复制,使得两个合取项产生的同一结果不重复。
在询问仅要求传回测量元素例项的情况下,针对检索到的每一成员,使用集合组帧编号从帧文件读取对应的组合隧道;且使用集合隧道编号来寻址秩隧道中的特定秩单元;否则使用集合组帧编号和集合隧道编号从帧文件读取集合隧道。
当正在打开事务内的询问的上下文内评估DNF表达(针对单一集合路径)时,
对于DNF内的每一合取项,针对所述合取项中的每一论断运算符文字创建集合组,如下文描述。每一运算符可与DNF上的其它运算符同时产生其自身的集合组。
所有集合组在每一合取项内合并在一起使得仅保持以每个集合组中的相同帧编号和集合隧道编号发生的条目。随后,每合取项将仅存在一个集合组。
使用每一集合组来直接传回帧编号和集合隧道编号。检索在合取项上循序发生,且结果解除复制,使得两个合取项产生的同一结果不重复。
当检索每一结果时,对照组合的帧编号和隧道编号请求独占锁。如果所述锁不立即授予,那么过程必须等待到其授予为止。立即向已拥有锁的事务授予所述锁。
如果在可配置超时周期之后,锁仍未授予,那么过程释放所有集合组资源和至此所获得的锁并继续等待锁授予、一旦锁已授予,就保持所述锁,且重新开始如此处描述的DNF评估。
当DNF内的合取项的上下文内结合集合组时,
以如先前描述的次序访问集合组和结合运算符。
当访问每一集合组时,直接从由对应的集合隧道编号存取的结合元素路径的摘要隧道地图填充每一成员的摘要隧道编号;用组内的成员的序数位置填充成员序数位置。
摘要隧道和序数位置接着分类且重新布置成递增帧以及摘要隧道和位置次序;接着针对每一帧中的隧道编号次序中的所有条目填充摘要条目。
当访问每一结合运算符时,削减终止集合组,借此在发起组中不具有对应的摘要隧道编号的任何成员将其基数复位到零。这依据与发起摘要隧道相关联的单元计数确定。
相关发起成员经由如先前描述的结合运算符传播。如果隧道编号或摘要不同,那么在潜在相关中忽视所述成员;否则使条目相关。
结合基数经由结合运算符反射回到如先前描述的发起集合组中。
随着结合过程进行,舍弃关于具有比组访问序数小的访问序数的先前传播序列的所有成员。
当在打开事务的上下文中产生exists()运算符的集合组时,
对于呈相反帧次序的每一堆文件,以相反年月日次序导览针对此集合路径以及与此事务或任何关闭的事务相关的事务片段。对于含有反演形式的每一单元,将组合的帧编号和集合隧道编号添加到基于存储器的反演形式组。含有所需元素路径的元素单元的任何单元包含在集合组中,条件是其组合的帧编号和集合隧道编号不包含在基于存储器的反演形式组中。
以递增比例次序且在其内以来自当前帧编号的递减帧次序检查每一元素路径的存储器驻留帧地图。
在找到匹配的帧间隔的情况下(在存在至少一个元素的情况下),选择开始所述间隔的帧编号。忽略与已扫描的堆文件相关的帧编号。
如果所选的帧编号不是当前打开的帧文件的帧编号,那么打开具有所选帧编号的集合路径集合隧道的帧文件和元素路径隧道族的帧文件。
从打开的帧文件读取集合路径的反演隧道和所需元素路径的存在隧道。以针对当前帧中的每一集合隧道的清除位创建反演形式的位图。
扫描反演隧道以获得反演单元,且针对找到的每一单元,将组合的反演帧和反演隧道编号添加到基于存储器的反演形式组,且在反演形式的位图中设定对应于反演隧道的位。
扫描存在隧道以获得指示元素存在的单元。忽略基于存储器的反演形式组中具有对应条目的任何单元;否则忽略反演形式的位图中具有对应位组的每一单元;否则将帧编号和集合隧道编号添加到集合组。
集合组条目始终标记为确定。
从与元素路径相关的当前打开的帧文件读取元素路径帧地图以确定下一相关帧且如上文描述继续,直到不可找到更多帧为止。
当在打开事务的上下文中产生is()运算符的集合组时,
从运算符操作数导出集合隧道编号和摘要编号。
对于呈反演帧次序的每一堆文件,以相反年月日次序导览针对此集合路径以及与此事务或任何关闭的事务相关的事务片段。对于含有反演形式的每一单元,将组合的帧编号和集合隧道编号添加到基于存储器的反演形式组。含有具有与运算符操作数等效的值的所需元素路径的识别元素单元的任何单元包含在集合组中,条件是其组合的帧编号和集合隧道编号不包含在基于存储器的反演形式组中。
以递增比例次序且在其内以来自当前帧编号的递减帧次序检查元素路径的存储器驻留帧地图。
在找到匹配的帧间隔的情况下(在所述间隔中的共同位均不与运算符操作数不同的情况下),选择开始所述间隔的帧编号。忽略与已扫描的堆文件相关的帧编号。
如果所选的帧编号不是当前打开的帧文件的帧编号,那么打开具有所选帧编号的集合路径的集合隧道和连接隧道的的帧文件。
从打开的帧文件读取从运算符操作数导出的集合路径的反演隧道和摘要隧道。以针对当前帧中的每一集合隧道的清除位创建反演形式的位图。
扫描反演隧道以获得反演单元,且针对找到的每一单元,将组合的反演帧和反演隧道编号添加到基于存储器的反演形式组,且在反演形式的位图中设定对应于反演隧道的位。
扫描摘要隧道以获得匹配的摘要单元。忽略基于存储器的反演形式组中具有对应条目的任何摘要单元;否则忽略反演形式的位图中具有对应位组的每一单元;否则将帧编号和集合隧道编号添加到集合组。
如果摘要单元充足,那么集合组条目标记为确定,否则在条目来自帧文件的情况下将其标记为不确定;而来自堆文件的条目始终标记为确定。
从与元素路径相关的当前打开的帧文件读取元素路径帧地图以确定下一相关帧且如上文描述继续,直到不可找到更多帧为止。
当在打开事务的上下文中产生in()运算符的集合组时,
如果两个运算符操作数均为正,那么令所需符号为正且令所需范围在运算符操作数的低与高绝对量值之间;否则如果两个运算符均为负,那么令所需符号为负且所需范围在运算符操作数的低与高绝对量值之间;否则将搜索划分为两部分,其中所需范围在最小运算符操作数与零之间且所需符号为负,以及范围在零与最大运算符操作数与零之间且所需符号为正。
所需范围的两个边界标准化为固定小数点附近的有效位数字节的固定数目。依据经标准化边界确定决定性秩,其中主元秩是具有两个经标准化边界中的共同有效位数字节的最低秩。将主元秩处的共同字节值称为主元值。
对于呈反演帧次序的每一堆文件,以相反年月日次序导览针对所述集合路径以及与此事务或任何关闭的事务相关的堆阵片段。对于含有反演形式的每一单元,将组合的帧编号和集合隧道编号添加到基于存储器的反演形式组。含有具有所需范围内的值的所需元素路径的测量元素单元的任何单元包含在集合组中,条件是其组合的帧编号和集合隧道编号不包含在基于存储器的反演形式组中。
以递增比例次序以及来自当前帧编号的递减帧次序检查元素路径的存储器驻留帧地图。
在找到匹配的帧间隔的情况下(在帧间隔范围与运算符操作数重叠的情况下),选择开始所述间隔的帧编号。忽略与已扫描的堆文件相关的帧编号。
如果所选的帧编号不是当前打开的帧文件的帧编号,那么打开具有所选帧编号的集合路径的集合隧道和组合隧道的的帧文件。
从元素路径帧文件读取元素路径的存在隧道、符号隧道和所有组合隧道,且从集合路径帧文件读取反演隧道。以针对当前帧中的每一集合隧道的清除位创建反演形式的位图。
扫描反演隧道以获得反演单元,且针对找到的每一单元,将组合的反演帧和反演隧道编号添加到基于存储器的反演形式组,且在反演形式的位图中设定对应于反演隧道的位。
检查主元秩的组合隧道的单元计数以查看是否存在针对主元值的任何相关单元。如果否,那么移动到当前帧地图中的先前帧且如上文继续。
对于从最高秩向下到主元秩的每一秩,使用单元计数来找到最低秩,其中所有单元在所述秩以上的隧道中为零,且其中两个操作数中的对应秩值均为零。将此秩称为高秩。
对于从最低秩向上到主元秩的每一秩,使用单元计数来找到最高秩,其中所有单元在所述秩以下的隧道中为零,且其中两个操作数中的对应秩值均为零。将此秩称为低秩。
扫描针对主元秩的组合隧道以获得与主元字节匹配的秩单元。忽略不具有对应的存在单元的秩单元;否则忽略基于存储器的反演形式组中具有对应条目的秩单元;否则忽略反演形式的位图中具有对应位组的每一单元;否则咨询高秩与低秩之间的对应的符号单元和秩单元以确保符号为所需符号,且组合的隧道秩量值在所需范围内,且如果是,那么将帧编号和集合隧道编号添加到集合组。
将集合组条目标记为确定。
从与元素路径相关的当前打开的帧文件读取元素路径帧地图以确定下一相关帧且如上文描述继续,直到不可找到更多帧为止。
当在打开事务的上下文中产生has()运算符的集合组时,
从运算符操作数导出特征隧道编号。
对于呈相反帧次序的每一堆文件,以相反年月日次序导览针对所述集合路径以及与此事务或任何关闭的事务相关的堆阵片段。对于含有反演形式的每一单元,将组合的帧编号和集合隧道编号添加到基于存储器的反演形式组。含有所需元素路径的枚举元素单元的任何单元(其含有所有运算符性质操作数)包含在集合组中,条件是其组合的帧编号和集合隧道编号不包含在基于存储器的反演形式组中。
以递增比例次序且接着以来自当前帧编号的递减帧次序检查元素路径的存储器驻留帧地图。
在找到匹配的帧间隔的情况下(在所有所需特征隧道编号具有其位组的情况下),选择开始所述间隔的帧编号。忽略与已扫描的堆文件相关的帧编号。
如果所选的帧编号不是当前打开的帧文件的帧编号,那么打开具有所选帧编号的集合路径集合隧道和特征隧道的帧文件。
从元素路径帧文件读取从运算符操作数导出的存在隧道和所需特征隧道,且从集合路径帧文件读取反演隧道。以针对当前帧中的每一集合隧道的清除位创建反演形式的位图。
扫描反演隧道以获得反演单元,且针对找到的每一单元,将组合的反演帧和反演隧道编号添加到基于存储器的反演形式组,且在反演形式的位图中设定对应于反演隧道的位。
所需特征隧道联合组合为位图,其中仅设定在所有所需特征隧道中的对应集合例项处具有位组的位位置。扫描组合的位图以获得组位,且忽略不具有对应的存在单元的任何组位,且忽略在基于存储器的反演形式组中具有对应条目的任何组位;否则忽略反演形式的位图中具有对应位组的每一单元;否则将帧编号和集合隧道编号添加到集合组。
集合组条目标记为确定,其中从唯一性质序数导出性质隧道编号且(M-N)<P<2N,其中P是性质序数,M是所指派的最大序数且N是性质隧道的数目,其中条目来自帧文件;而来自堆文件的条目始终标记为确定。
从与元素路径相关的当前打开的帧文件读取元素路径帧地图以确定下一相关帧且如上文描述继续,直到不可找到更多帧为止。
当在打开事务的上下文中产生true()运算符的集合组时,
对于呈相反帧次序的每一堆文件,以相反年月日次序导览针对此集合路径以及与此事务或任何关闭的事务相关的事务片段。对于含有反演形式的每一单元,将组合的帧编号和集合隧道编号添加到基于存储器的反演形式组。所需集合路径的任何集合例项身份包含在集合组中,条件是其组合的帧编号和集合隧道编号不包含在基于存储器的反演形式组中。
以最低比例以来自当前帧编号的递减帧次序检查集合路径的存储器驻留帧地图。忽略与已扫描的堆文件相关的帧编号。
在帧地图条目指示一个或一个以上反演形式的情况下,打开集合帧文件且读取反演隧道;以针对当前帧中的每一集合隧道的清除位创建反演形式的位图;扫描反演隧道且针对找到的每一反演单元,将组合的反演帧和反演隧道编号添加到针对找到的每一反演形式的基于存储器的反演形式组,且在反演形式的位图中设定对应于反演隧道的位。
附加在隧道1处开始且在帧地图指定的集合例项的编号处结束但排除在反演形式的位图中具有位组或在基于存储器的反演形式组中具有对应条目的那些隧道的集合例项隧道的邻近序列。这些条目的帧编号是用于检查帧地图条目的帧编号。
集合组条目始终标记为确定。
从当前打开的帧文件读取集合路径帧地图(如上文描述以前一帧继续)。此如上文描述继续,直到不可找到更多帧为止。
当在打开事务的上下文中具体化合取项时,
对于集合组中的每一不确定条目,必须读取对应的集合隧道,且必须检查对应的元素例项以确定确定性或不可能性。
在元素例项随后被认为不可能的情况下,将其基数标记为零,且将条目视为在集合组中无效,且使合取项内的集合组的合并期间的所有对应条目无效。
当将片段从堆文件迁移到帧文件时,
仅迁移与尚未迁移的所施加事务相关的片段。忽略与终止的事务相关的片段。对与打开的事务相关的片段进行计数。
轮流个别地迁移每一集合路径。
创建集合路径内的每一隧道族和每一元素路径的存储器扇区地图和隧道。将每一隧道的开始处的隧道链接初始化为先前帧。
在迁移集合路径之前,将集合路径及其相关元素路径的帧地图从在正迁移的帧之前的帧文件读取到存储器中。
在迁移集合路径之前,读取存储地图;将集合路径的反演隧道和所有相关元素路径隧道的隧道从需要累积到正迁移的帧中的任何帧文件迁移到存储器中。
对于正迁移的每一片段,在存储器中创建新的集合隧道且将片段单元复制到集合隧道中。对于反演形式,将反演单元附加到反演隧道。如先前描述更新集合路径帧地图。接着迁移片段内的每一元素单元且更新集合路径存储地图。
对于每一识别元素,如先前描述,构建摘要单元,且将其附加到相关摘要隧道。将摘要隧道编号附加到隧道地图。将存在单元附加到元素路径存在隧道。如先前描述依据元素值更新元素路径帧地图,且更新元素路径存储地图。
对于每一测量元素,如先前描述,针对每一秩隧道构建秩单元,且将其附加到相关秩隧道。将存在单元附加到元素路径存在隧道。如先前描述依据元素值更新元素路径帧地图,且更新元素路径存储地图。
对于每一枚举元素,如先前描述,针对每一性质隧道构建性质单元,且将其附加到相关性质隧道。将存在单元附加到元素路径存在隧道。如先前描述依据元素值更新元素路径帧地图,且更新元素路径存储地图。
在迁移片段中的每个元素单元之后,针对不包含在片段中的每个元素路径,将非存在单元附加到存在隧道;将零秩单元附加到片段中的所有非存在元素路径中的每个秩隧道;将非存在性质单元附加到片段中的所有非存在元素路径中的每个性质隧道。
在迁移所有片段之后,使用最高堆文件帧编号创建帧文件,且重写可能已存在的任何此类帧文件。将扇区地图、帧地图和隧道写入到每一帧文件。
将堆文件中的所有已迁移事务句柄标记为已迁移且使堆文件同步回以进行存储。
将每一已迁移事务句柄标记为可用于再次使用。
如果堆文件含有与打开的事务相关的任何片段,那么保持堆文件,否则将其删除。
上文描述的是满足(尤其)先前陈述的目标的设备、系统和方法。将了解,本文所论述和展示的实施例仅为本发明的实例,且并入有此处展示和描述的改变的其它实施例落在本发明的范围内。