一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

使用对称向量处理对散列表的加速的构建和探测的制作方法

2022-06-06 00:11:50 来源:中国专利 TAG:


1.本发明涉及关系联接(join)加速。本文是用于联接行集的优化技术和散列表。


背景技术:

2.联接查询在关系数据库管理系统(rdbms)中是普遍的。联接查询基于相关的联接键列的集合组合来自两个或更多个数据库表的行。在本文中,联接键可以是参与诸如等值联接之类的关系联接的谓词的列,诸如在关系表或列族中的列。联接键可以是或者可以不是包含该列的数据库表或任何其它数据库表或复合候选键的一部分的候选键。候选键是主键、辅助键或唯一地识别行的任何其它键。可以通过在构建阶段期间将数据库表中的一个数据库表(本文称为构建表)的列处理成数据结构,并随后在探测阶段使用剩余数据库表(本文称为探测表)的联接键列以探测数据结构的匹配项来执行两个数据库表的联接。例如,散列联接在构建阶段期间通过将散列函数应用于构建键值来填充散列表。将构建表的行与探测表的行进行匹配在本文中称为做出匹配(matchmaking),这发生在探测阶段期间。
3.联接操作广泛用在结构化查询语言(sql)处理中。用于实现联接的一类广泛使用的技术是创建散列表,该散列表对联接操作数中的一个建立索引,然后用另一个联接操作数探测这个散列表。在处理每个记录时,这种技术的典型实施方式按顺序探测每个值(即,一次一行)。
4.针对探测表中的每一行按顺序探测散列表(一次一行)的这种方法效率低下,尤其是在应用于存储器中列式数据(诸如向量化的数据)时,并且没有利用现代计算机系统中央处理单元(cpu)和存储器控制器的属性和能力。
5.hash join是支持分析工作负载(诸如报告和数据挖掘)的rdbms的重要操作符,因为模式规范化通常强加多维数据拓扑,诸如用于数据仓库的星形或雪花形,这可能需要用于典型处理的多个联接。为了支持散列联接,通常构建散列表来联接来自具有相似联接键的两个表的数据,诸如针对等值联接。但是,对于高效的散列表数据结构和算法存在一些困难:
6.·
准确预测联接选择性和构建表基数可能是困难的或者是不可能的,这可以是估计散列表的数据分布的关键因素,作为建立散列表的初始容量的前言。
7.·
调整散列表的尺寸通常是昂贵的。已插入的数据越多,调整尺寸就越昂贵。而且,在调整散列表尺寸时暂停插入也是不期望的。
8.·
探测散列表通常占用大部分查询处理时间,因为探测表通常比构建表具有更多的行。其它方法的散列表格式不适合加速探测,因此效率低下。
9.一般而言,其它方法涉及为过时的计算风格和硬件设计的数据结构、格式和算法。
附图说明
10.在附图中:
11.图1是描绘基于散列表的优化布置和操作来联接数据行的示例计算机的框图;
12.图2是描绘示例散列表探测过程的流程图;
13.图3是描绘示例散列表构建过程的流程图;
14.图4是描绘针对散列表或另一种数据映射的示例分段和间接取值(indirection)方案的框图。
15.图5是描绘用于加速探测和/或构建的示例并行过程的流程图。
16.图6是描绘用于加速探测和/或构建的示例并行过程的流程图。
17.图7是描绘示例计算机的框图,该计算机联接构建和探测数据行,并基于从多个种类的数据映射中对一个种类的数据映射的优化选择。
18.图8是描绘动态地选择多个种类的数据映射中的一个种类的数据映射用于执行关系联接的示例计算机过程的流程图。
19.图9是描绘动态地选择多个种类的数据映射中的一个种类的数据映射用于执行关系联接的示例计算机过程的流程图。
20.图10是图示可以在其上实现本发明的实施例的计算机系统的框图;
21.图11是图示可以用于控制计算系统的操作的基本软件系统的框图。
具体实施方式
22.在下面的描述中,出于解释的目的,阐述了许多具体细节以便提供对本发明的透彻理解。但是,将显而易见的是,可以在没有这些具体细节的情况下实践本发明。在其它情况下,以框图形式示出了众所周知的结构和设备,以避免不必要地模糊本发明。
23.总体概述
24.本文是用于关系联接与其它方法的加速的新颖的执行技术。描述了高效利用中央处理器(cpu)向量化处理能力来构建和探测散列表的若干技术,具有对存储器中列式结构化查询语言(sql)数据库查询处理的应用。
25.所描述的算法融合了列式数据固有的并行性质和现代cpu的向量能力,以比以前的实施方式更高效地构建和探测散列表。此外,它们更好地利用当前计算机体系架构所特有的宽寄存器、超标量执行和存储器层次结构行为。
26.本文是用于以加速方式为表格式数据库(诸如关系数据库)构建和探测散列表的技术,并具有针对列式数据(诸如对于列式数据库)的附加优化。在现有技术中,散列表探测通常一次一个键值、一次一个桶、一次一个值查找等地完成。这是顺序处理,这导致性能低于标准。本文提出的算法优化了对散列表的批量探测。因此,对数据向量的大多数或所有操作都是通过一次处理多个值来执行的,而不是一次处理一个值。
27.在实施例中,各种单指令多数据(simd)指令可以被用于并行执行联接操作的探测阶段。在一个实施例中,使用simd在仅几个紧凑的指令序列中并行执行十六键探测。使用simd指令对散列表的新型并行化探测比其它探测方法快两到三倍。
28.用于联接的探测阶段的散列表的构造也在本文进行了优化。有时构建散列表比探测更昂贵。因此,使用本文描述的技术对构建阶段的加速是非常有益的。本文中的技术通过使用线程的粗粒度并行化和使用simd的细粒度并行化两者来并行化构建。下文将更详细地描述诸如任务并行化之类的粗粒度并行化和诸如数据并行化之类的细粒度并行化。使用simd指令的散列表的新颖并行构建比其它构建阶段方法快两到三倍。
29.本文的技术适用于数据库系统的数据组织操作,诸如关系联接,但也适用于其它种类的组织操作,诸如分组和分箱。本文的方法匹配、分组或计数结构化数据,诸如值的一维向量或数据库表的列或某种其它行集合。这种参与列或向量在本文中被称为键。因此,键是在本文称为键值的值的有序或无序集合。例如,july(七月)可以是存储在按月份分组的数据库表的月份列中的键值。在该情况下,键是作为分组键的月份列。
30.本文的散列表和其它种类的映射可以被用于应当在情境相关的单独数据项的做出匹配,诸如对于关系联接。在实施例中,散列表记录哪些键值出现在数据集中,诸如一维向量(诸如数据库的列)。在实施例中,散列表附加地:a)对重复键值或累积其它统计数据进行计数和/或b)保留对源项(诸如表的行或其它行集合)的引用或来自源项的值。在此类情况下,散列表可以被用于基于键值获得值,诸如行标识符的计数、标志或数组。在本文中,那些映射到的值,无论是键值、其它原始的或导出的标量值,还是数据结构,都被称为条目。
31.在实施例中,在散列联接的构建阶段期间,计算机接收访问构建数据行的请求,每个构建数据行与相应的构建键值相关联。从散列表的多个桶中,选择包含在特定桶内的相应位置中的多个相应构建键值的条目的特定桶。检测特定桶是否包含特定构建数据行的构建键值的条目。并发地检查特定桶内的多个位置,以找到空位置来存储特定数据行的构建键值的条目。对于访问构建数据行的请求,发送基于散列表的响应。
32.在实施例中,在散列联接的探测阶段期间,计算机接收访问探测数据行的请求,每个探测数据行与相应的探测键值相关联。从散列表的多个桶中,选择包含多个相应构建键值的条目的特定桶。并发地探测特定桶以检测特定桶中的条目是否包括特定数据行的探测键值的条目。对于访问探测数据行的请求,发送基于特定桶的并发探测的响应。
33.在实施例中,计算机接收对构建数据行与探测数据行的关系联接的请求。根据对关系联接的请求,从可以实现关系联接的多个种类的数据映射中动态选择特定种类的数据映射。基于构建数据行,填充特定种类的数据映射的实例。为针对基于探测数据行和特定种类数据映射的实例的关系联接的请求发送响应。
34.1.0示例计算机
35.图1是描绘实施例中的示例计算机100的框图。计算机100基于散列表170的优化布置和操作来联接数据行110和130。计算机100可以是至少一个机架服务器,诸如刀片、个人计算机、大型机、虚拟计算机或其它计算设备。当计算机100包括多个计算机时,这些计算机通过通信网络互连。
36.在各种实施例中,计算机100提供对诸如关系数据库、图形数据库、nosql数据库、列数据存储库、元组数据存储库(诸如资源描述框架(rdf)三元存储库)、键值数据存储库或文档数据存储库(诸如对于包含javascript对象表示法(json)或可扩展标记语言(xml)的文档)之类的大容量数据存储库的访问。在任何情况下,数据存储库都可以由诸如应用之类的软件或诸如数据库管理系统(dbms)之类的中间件来管理。存储在数据存储库中的数据可以驻留在易失性和/或非易失性存储装置中。
37.在这个示例中,数据被组织为字段,诸如120、140和其它字段,如图所示。在这个示例中,字段可以具有逻辑和/或物理的表格式布置,使得字段被布置为每行一个记录和每列一个字段。例如,数据行110和130可以各自是关系表、列族或诸如中间结果之类的内部行集合。例如,构建数据行110包含行b1-b3。
38.a和b是可以存储在易失性和/或非易失性存储装置中的字段120和140的示例值。在操作中,计算机100接收或生成在数据存储库中读取和/或写入数据的请求150。在实施例中,请求150被表述为诸如创建读取更新删除(crud)语句或示例查询(qbe)之类的数据操作语言(dml)。例如,请求150可以是结构化查询语言(sql)dml语句,诸如查询。在实施例中,请求150是通过开放数据库连接(odbc)接收的。
39.1.1使用散列表的联接处理
40.取决于示例,请求150可以直接指定(如图所示)数据行110和130之间的关系联接,或以其它方式使这种联接隐式发生,诸如通过调用其实施方式包括这种联接的数据库视图或存储的过程。虽然示出了单字段等值联接,但其它联接也是可能的,诸如基于多个字段、不等式和/或包括null(空)的联接。如图所示,请求150指定“build.field=probe.field”,这需要基于字段120和140的相等性来联接数据行110和130。
41.计算机100在构建阶段执行针对请求150的联接,随后是探测阶段。构建阶段基于构建数据行110来填充散列表170。构建阶段需要迭代通过字段120中的值。例如,构建数据行110可以是关系表,其行b1-b3在表扫描期间被迭代以访问字段120的内容。在另一个示例中,字段120可用作诸如随机存取存储器(ram)中的一维向量。因此,构建数据行110以行为主形式还是列为主形式可用并不重要。
42.散列表170包含固定或增加数量的桶,诸如y-z。每个桶y-z包含相同的固定数量的位置,诸如0-1,它们可以是桶的桶内容数组中基于零的偏移量。例如,桶和桶内容数组可以是同一个对象。散列表170中的位置列可以是隐性的,而不是实际存储的。
43.位置0-1是同一个桶y内的不同偏移量并且仅应当用于同一个桶y。例如,桶y-z中的多个位置0是不可互换的独立位置。计算机100小心不要计算桶y中的位置,然后使用该计算出的位置访问其它桶z。
44.构建阶段并发地列举行b1-b3的相应字段120值a、b、a。该值集合中的每个值出现都有机会:a)取决于场景,将构建键值的不同或重复的条目插入到散列表170中,和/或b)指派或修订散列表170中的元素。条目的结构取决于本文稍后讨论的场景。例如,条目可以是或者可以不是所示的构建键值。
45.最初在这个示例中,散列表170可以在桶y-z中包含空位置0-1。例如,桶z的位置1是空的,如图所示。当构建阶段遇到针对行b1的字段120的值a时,可以诸如以下根据场景发生各种活动。
46.如上面所解释的,散列表170包含桶y-z的数组。例如,y-z可以是桶的数组的偏移量。在实施例中,桶y-z在存储器中是连续的或不连续的。在实施例中,同一个桶y中的位置0-1在存储器中是连续的或不连续的。
47.值a可以作为散列码或作为计算散列码的散列函数的输入来操作。散列码的一些或所有比特可用作桶数组的偏移量以识别桶。值a散列到桶y,如图所示。
48.在识别桶y之后,可以诸如以下根据场景发生各种其它活动。值a的条目可以作为构建键值存储在最初可以是位置0的第一空位置中。在这个示例中,条目可以通过引用数据结构直接或间接包含:a)值a,b)散列码,c)标识符或指向行b1的指针,如元素列中所示,和/或d)其它数据,诸如行b1的其它字段。
49.可以如下忽略或处理重复的构建键值。例如,桶y中位置0中的条目可以附加地或
代替地包含值a在字段120中出现的次数的计数。
50.在这个示例中,值a再次出现在行b3中,并再次散列到同一个桶y。如图所示,值a和行标识符b3如图所示存储到桶y中的下一个空位置,该位置可以是位置1。
51.行b2的值b散列到桶z,如图所示。不同的散列码和/或构建键值值可以被映射到相同或不同的桶。当构建阶段结束时,构建键列和元素列的内容如图所示。因此,当构建阶段结束时,散列表170的填充完成,并且探测阶段可以开始。
52.探测阶段通过如下将字段140的值与字段120的值匹配来将探测数据行130的行与构建数据行110的行匹配。探测阶段并发地列举行p1-p3的相应字段140值b、a、a。该值集合中的每个值出现都具有作为探测键值来匹配散列表170中的构建键值的机会。例如,行p1的值b散列到桶z并匹配位置0中的构建键值b。
53.其它联接方法可能需要在构建阶段和/或探测阶段期间进行线性扫描,这是缓慢的。本文的技术不进行线性扫描。因此,本文的联接被加速。
54.如上面所解释的,桶y可以包含重复的构建键值a。相同探测键值的每次出现都可以匹配重复的构建键值。例如,值a在字段120和140中有重复项。例如,联接结果被示为响应180,其包含构建数据行110的行的标识符与探测数据行130的行的标识符的配对。
55.例如,探测行p2的值a与每个散列表170的构建行b1和b3匹配。因此,响应180包含p2xb1和p2xb3。在这个示例中,响应180是回答请求150并包含联接结果的最终结果。在另一个示例中,联接结果是中间结果,并且响应180基于但不包含联接结果。
56.在各种示例中,散列表170的元素、联接结果和响应可能需要各种量的物化,诸如投影。例如,数据行110和130的其它字段中的一些可以是可以包括或可以不包括在联接结果和/或响应180中的有效载荷列。构建数据行110的其它字段中的一些字段可以包括或可以不包括在散列表170的元素中。
57.只要行标识符或主键包括在联接结果中和/或散列表170的元素中,不直接涉及做出匹配的附加列的物化就可以被推迟到请求150的执行的各种后期阶段。例如,投影可能需要附加列,并且在生成响应180之前,所有附加列都可能未物化。联接结果可以包含构建数据行110的行标识符和/或探测数据行130的行标识符,或者两者都不包含。
58.1.1行标识符和重复项
59.唯一地识别各个行的行标识符的实施方式取决于实施例。这样的实施方式可以包括:a)或多或少的持久rowid,诸如物理存储标识符或定位符,b)易失性行标识符,诸如易失性指针,诸如存储器地址或数组偏移量,或c)候选键。候选键可以是简单的或复合的。例如,表的主键可以是候选键。不同的行集合可以具有不同的行标识符实施方式。
60.例如,持久表可以具有带有嵌入式磁盘块编号(诸如逻辑块地址(lba)和字节偏移量)的rowid,而诸如用于中间结果的易失性表可以代替地使用指针作为行标识符。如果存储器地址与大于最小可寻址的单位(通常是字节)对准,那么指针的最低有效比特可以被截断,使得隐含未使用的比特,并且:a)重新用于具有非寻址语义的比特域,或b)不存储,诸如用于将多个指针比特打包到更小的空间中。
61.在实施例中,易失性行标识符仅在该行从高速缓存中被逐出之前才有效。例如,当行稍后在同一数据库会话中重新加载到高速缓存中时,该行被重新指派不同的易失性行标识符。在实施例中,持久行标识符只是在某种程度上是永久的。例如,对持久表的压缩可以
使得持久行从一个盘块移动到另一个盘块,这可以为行重新指派不同的rowid。
62.如本文前面所示和解释的,散列表170可以存储包括构建键值和/或散列表170的元素列的构建键条目。如图所示,桶y中的位置0-1包含相同构建键值a的相应出现b1和b3。换句话说,对于相同构建键值的每个重复出现,散列表170需要在同一个桶中的单独位置,这可能是效率低下的。例如,许多重复项可能造成桶y溢出,如本文稍后讨论的。
63.散列表170与散列表171之间的一个区别在于散列表171将相同构建键值的所有重复出现整合到相同构建键条目中,如下面所讨论的。因此,散列表171“集群”重复构建键值出现。为了比较展示,散列表171包含散列表170的内容的超集。如图所示,散列表171包含散列表170缺少的构建键值c。
64.桶x和z的内容是否则完全相同的内容的替代存储器格式。同样,桶w的内容是桶y的内容的超集,如下面所解释的。
65.在所示的散列表170和171中,每个散列桶具有两个“位置”:位置0和位置1。每个位置与构建键条目对应。例如,桶y的位置0具有构建键条目[构建键a,元素b1],而桶y的位置1具有构建键条目[构建键a,元素b3]。
[0066]
1.2指示字段
[0067]
在所示实施例中,桶x和z的位置1是空的。在散列表171中,如果在那个位置的构建键条目的“指示”字段中的所有比特都为零,那么桶中的位置是空的。例如,可以通过将桶内所有位置的指示字段中的所有比特设置为0来初始化桶。在指示字段内,0

0000描绘零比特的数量。实际比特数取决于实施例。
[0068]
构建键值b在散列表170-171中的每一个中仅出现一次。用于构建键值b的构建键条目出现在散列表170中桶z的位置0中。在散列表171中,用于构建键值b的构建键条目位于桶x的位置0中。用于构建键值b的构建键条目的指示字段被示为r

rrr0。r

rrr0是至少具有最低有效比特零的比特集合。该比特集合中的每个r是rid的比特。rid将在本文后面讨论。rid可以是rowid,其标识表或中间行集合中的行。例如,每个rid可以是指针或数组偏移量。例如,一个散列表可以包含指针rid,而另一个散列表可以包含相同或不同行集合的偏移量rid。
[0069]
因为并非在散列表171中包含rid的构建键条目的所有比特都用于rid,因此rid应当具有比构建键条目更少的比特,因为构建键条目的一些比特可以是如本文稍后讨论的其它目的所需要的。例如,rid可以是带有(一个或多个)隐含比特的截断的指针。rid、指针、截断和偏移量将在本文后面讨论。
[0070]
1.3处理构建键冲突
[0071]
桶w包含构建键值a和c的构建键条目。在这个示例中,构建键值a和c通过产生相同的散列码而造成“冲突”。虽然未示出,但由于散列冲突,因此散列表170可以在同一个桶中具有多个不同的构建键值。冲突可以造成字段120的未加工数据中不存在的偏差。无论是由散列函数中的偏差还是由字段120中的数据偏斜引起的,重复的构建键值以及在较小程度上的其它冲突可以如下缓解。
[0072]
如上面所解释的,桶w中的位置0包含表示相同构建键值a的两次出现b1和b3的构建键条目。对于重复项,构建键条目的几个最低有效比特是对相同构建键值的重复项进行计数的计数器比特字段。因为重复项涉及相同构建键值的至少两次出现,因此如图所示的
计数器的最低/初始二进制值001表示计数为二。将计数器从二递增到三会将二进制值从001改为010。
[0073]
在桶w中的构建键条目的指示字段中,p...p是指向rid的数组的截断的指针的比特,使得为构建键值a和c示出两次的p...p对不同的相应指针进行编码,因此具有不同的比特值。rid的数组用于相同构建键值的重复出现。构建键条目的计数器比特字段的值表示在截断的指针指向的数组中存储了多少rid。如本文稍后讨论的,截断的指针是指针的前缀,其可以通过附加一些隐含为零的最低有效比特而扩展成为完整指针。
[0074]
rid数组的容量有限,并且递增计数器比特字段可以需要或可以不需要重新分配rid数组以具有更多容量来存储更多rid。同样,rid数组可以具有过多的容量,使得如果rid数组有空槽,那么将另一个重复项出现的新rid插入该槽中,并且计数器递增,但截断的指针在构建键条目中保持不变。代替地,如果rid数组已满,那么将这些现有rid从rid数组复制到更大的rid数组。
[0075]
新rid也存储在新rid数组中。旧rid数组被丢弃或返回到池中以供重用,并且构建键条目中的截断的指针被重新指派以指向新rid数组。在任何情况下,构建键条目中的计数器比特字段都会递增。
[0076]
1.4处理计数器比特溢出
[0077]
如上面所解释的,指示字段中的计数器比特字段对在rid数组中存储了多少个rid用于该指示进行计数。按如下避免计数器比特字段的溢出。当计数器递增到全一的最大二进制值(如针对构建键值c所示)时,发生以下情况:a)现有rid从rid数组复制到更大的自描述rid数组,该数组具有对有多少rid存储在新rid数组中进行计数的计数器,b)新rid存储在新rid数组中,以及c)构建键条目中的计数器比特字段保持冻结为全一,如图所示,使得针对后续重复项的增量对于使用新rid数组中的计数器而不是构建键条目中的计数器比特字段发生。
[0078]
为了避免进一步的计数器溢出,新rid数组中的计数器比计数器比特字段更宽,并且足够宽,以便从不溢出。如果新rid数组本身(而不是其计数器)溢出,那么更大的自描述rid数组可以替换当前的自描述rid数组,这需要将rid复制到更大的rid数组中并重新指派构建键条目中的截断的指针。在实施例中,对于同一个桶中的同一个位置,每个新的自描述rid数组都比它所替换的rid数组呈指数级更大。
[0079]
在一个这样的实施例中,指数级增加需要双倍的尺寸。如本文后面所讨论的,指数级尺寸设计非常适合数据偏斜。在实施例中,固定或更大尺寸的新rid数组不替换旧rid数组,而是代替地附加或追加到rid数组的链表上,该链表形成用于同一个桶的同一位置的分段数组(segmented array)。
[0080]
数据偏斜是在字段120和/或140中以不同频率出现的不同联接键的示例。利用散列表171中构建键值a-c的构建键条目中的rid和指针编码,构建键条目的信息密度与频率成反比。即,构建键值b最不频繁,但构建键值b的构建键条目最密集,因为它直接对rid进行编码,而不是对用于间接取值的指针进行编码。
[0081]
构建键值a更频繁,并且构建键值a的构建键条目密度较低,因为它对rid进行计数但不对rid进行编码。构建键值c最频繁,但构建键值c的构建键条目密度最小,因为它既不对rid进行编码也不对rid进行计数。
[0082]
在这种反比例信息密度下,存在存储器消耗的反直觉减少,因为即使构建键值c出现次数最多(例如,十次),那十次出现也共享相同的集群构建键条目。在此,聚类需要重复的构建键值。而对于每个单例构建键值(诸如构建键值b)都需要单独的构建键条目。在此,单例意味着没有重复项。因此,即使单例构建键值少于构建键值c的重复出现,单例构建键值也可以比聚类的构建键值多。因此,与直觉相反,更密集的单例构建键条目的空间节省可以超过不太密集的集群构建键条目的空间成本。
[0083]
同样,构建键值c的构建键条目的信息密度小于构建键值a的信息密度,如上面所解释的,即使构建键值a和c都具有聚类的构建键条目。但是,用于构建键值c的较低密度是一种空间成本,与构建键值a相比,它在更多重复项中摊销,因为构建键值a更不频繁。以这些方式,散列表171的构建键条目在空间上被优化。
[0084]
2.0示例探测过程
[0085]
如本文前面所解释的,散列联接可能需要填充散列表170的构建阶段,随后是使用散列表170做出匹配的探测阶段。图2描绘了示例探测阶段。图3描绘了示例构建阶段。
[0086]
例如,并且如本文稍后解释的,在不融合来自两个阶段的操作符的情况下,计算机100可以执行图3的构建过程,然后随后针对相同的散列表170执行图2的探测过程。但是,本文首先呈现图2,因为探测阶段的一些实施例可以比构建阶段稍微简单一些。参考图1来讨论图2-3。
[0087]
图2是描绘联接数据行110和130的示例探测过程的流程图。在实施例中,探测阶段的新颖加速是通过并发探测散列表170中的多个条目来提供的,诸如使用如本文稍后描述的单指令多数据(simd)。
[0088]
步骤202接收基于字段120和140指定或暗示数据行110和130的关系等值联接的请求150。在步骤202的实施例中,查询计划器、优化器和/或编译器将请求150转化成可解释或可执行的形式,诸如数据库操作符树。在实施例中,联接的构建阶段和探测阶段由树中的相应操作符实现。
[0089]
在实施例中,表扫描操作符与用于构建阶段的构建操作符融合(即,组合)。在实施例中,探测阶段的探测操作符与有效载荷操作符融合,该有效载荷操作符用附加字段(诸如数据行110和/或130的投影的其它字段)补充联接结果。例如,散列表170的元素可以包含构建数据行110的一些或所有其它字段。
[0090]
诸如图3的过程之类的构建阶段可以发生在步骤202和204之间。步骤204假设散列表170已经被填充,诸如由构建阶段填充。构建阶段之后可以是诸如以下的探测阶段。
[0091]
在一个示例中,构建数据行110用在构建阶段中,并且探测数据行130用在探测阶段中。取决于实施例和场景,数据行110和130可以在语义、格式和/或内容上不同,但在某种程度上是可互换的用于联接的相应数据集。在实施例中,计算机100可以决定这两个数据集中的哪一个用于构建阶段,而另一个数据集将用于探测阶段。例如,探测数据行130可以代替地用于构建阶段,并且构建数据行110可以用于探测阶段。
[0092]
探测阶段包括步骤204和206,可以针对探测数据行130中的每一行的相应探测键值重复这些步骤。探测数据行p1具有字段140的值b作为其探测键值。从散列表170的桶y-z中,步骤204基于值b的一些或所有比特或值b的散列码的一些或所有比特选择包含零个或多个相同或不同构建键值的条目的桶z。
[0093]
步骤206将探测数据行130的相应探测键值(即,字段140)与散列表170的相应元素进行匹配。在步骤206中迭代地使用探测键值,通过并发地将部分或全部探测键值或其散列码与全部或部分构建键值或桶中的散列码进行比较,将探测键值与桶y或z的元素匹配,无需线性扫描。并发比较是创新的并且稍后将在本文中讨论。
[0094]
步骤206产生联接结果。步骤208发送回答请求150的响应180。取决于示例:a)联接结果可以是响应180,b)响应180可以包含联接结果和附加数据,c)响应180可以包含联接结果的一些垂直和/或水平切片,或c)响应180否则基于但不包含联接结果。
[0095]
3.0示例构建过程
[0096]
图3是描绘基于构建数据行110填充散列表170的示例构建过程的流程图。在实施例中,构建阶段的新颖加速是通过并发访问散列表170中的多个条目来提供的,诸如使用如本文稍后描述的单指令多数据(simd)。在实施例中,构建阶段比其后的探测阶段更复杂。
[0097]
步骤301接收请求150,该请求150基于字段120和140指定或暗示数据行110和130的关系等值联接。虽然示为单独过程中的单独步骤,但是步骤301和图2的步骤202可以是接收请求150的同一步骤。除了本文别处解释的以外,步骤202和301被组合成单个步骤。
[0098]
构建阶段包括步骤302-305,可以针对构建数据行110中的每一行的相应构建键值重复这些步骤。构建数据行b1具有字段120的值a作为其探测键值。从散列表170的桶y-z中,步骤302基于值a的一些或所有比特或值a的散列码的一些或所有比特来选择包含零个或多个相同或不同构建键值的条目的桶y。
[0099]
构建阶段和探测阶段都使用联接键值来查找桶。在实施例中,步骤302和图2的步骤204是共享相同步骤实施方式的单独阶段中的单独步骤。例如,步骤204和302可以是相同子例程的单独调用,即使步骤302使用构建数据行110的构建键值并且步骤204使用探测数据行130的探测键值。即,构建键和探测键都是联接键,在各种示例中可以以相同的方式(诸如对于等值联接)进行部分处理。
[0100]
对于构建数据行110中的任何数据行发生步骤303-305的哪个子集可以取决于:a)重复项是否可能,b)值a是否是重复项,c)重复项是否与请求150相关,和/或d)重复项应当集成还是保持分开。下面的表1示出了基于以下构建场景311-315和构建数据行110中的每一行的条件在步骤302之后的步骤。相同构建数据行110中的不同行可能需要相同或不同的相应构建场景。
[0101]
因此,步骤303-305的不同相应子集可以针对不同的构建数据行发生。例如,值a的第一次出现不是重复项,但同一个值a的第二次出现是重复项。因此,同一个值a的不同出现可以或者可以不造成不同的构建场景。同样,基于值a造成哪个构建场景,同一步骤的行为可以或可以不有所不同。
[0102]
构建场景重复项可能吗?是重复项吗?重复项处理步骤的子集311否
ꢀꢀ
304-305312是否 303-305313是是通过跳过忽略303314是是集成303,305315是是保持分开303-305
[0103]
在构建场景311中,重复构建键值是不可能的,使得每个构建数据行具有不同的相
应构建键值,诸如在以下情况下:a)关系模式指示字段120具有不同的值,b)构建数据行110是基于行聚合的中间结果,诸如使用分组,使得字段120必然具有不同的值,或c)构建数据行110的扫描或索引扫描或其它检查凭经验指示字段120偶然具有不同的值。例如,为包含与构建数据行110中的行一样多的字典代码的关系表或存储器压缩单元(imcu)动态生成的字段120的编码字典可以或可以不指示字段120偶然具有不同的值。imcu将在本文后面讨论。
[0104]
步骤303检测散列表170是否已经包含当前构建键值。如果散列表170已经包含构建键值,那么发生步骤305。否则,构建键值不是重复项,并且步骤304如下发生。步骤303将在本文后面进一步讨论。
[0105]
步骤304并发地在桶y内的所有位置0-1中找到空位置。在实施例中,空位置被表示为存储空联接键值的条目。在该情况下,步骤304和图2的步骤206是共享相同步骤实施方式的单独阶段中的单独步骤。
[0106]
例如,步骤206和304可以是相同子例程的单独调用,因为空键值和探测键值都是在各种示例中可以以相同方式被部分处理的联接键值。不管空键值是否表示空位置,步骤206和304都可以具有相似的并行化。当桶y包含多个空位置时,根据取决于实施例的准则来选择一个空位置。
[0107]
步骤305在桶y内的位置中存储或调整作为构建数据行b1的构建键值的值a的条目。步骤305的行为和桶y内的位置取决于构建场景。对于构建场景311-312和315:a)该位置是由步骤304找到的空位置,以及b)值a的新条目被存储到该空位置中。
[0108]
在构建场景312中,构建数据行b1具有值a的第一次或唯一出现,即使重复项是可能的。在该情况下,步骤303检测到值a不是重复项。不管构建场景和值a是否是重复项,步骤303都如下发生。
[0109]
如上面所解释的,步骤303检测桶y是否包含作为构建数据行b1的构建键值的值a的条目。在实施例中,步骤303和图2的步骤206是共享相同步骤实施方式的单独阶段中的单独步骤。例如,步骤206和303可以是同一子例程的单独调用,因为构建键和探测键都是在各种示例中可以以相同方式被部分处理的联接键,诸如对于等值联接。
[0110]
因此,步骤206和303可以具有相似的并行化。步骤303可以同时将值a与同一个桶y中的多个相同或不同值的条目进行比较,而无需线性扫描。
[0111]
在构建场景313-315中,步骤303检测到值a是重复项。在构建场景313中,重复项与请求150无关,并且应当通过跳过用于构建数据行b3的步骤304-305来忽略构建数据行b3。例如,请求150可以是使用事实表和维度表的等值联接进行过滤的在线分析处理(olap)查询,但响应180不包括事实表并且仅投影维度表。
[0112]
例如:a)购买订单可以是事实,b)维度表可以对产品进行分类,以及c)响应180仅指示没有购买订单的产品。这假设构建数据行110是事实(即,购买订单)。实施例可以自由地将事实表或者维度表用于构建阶段,而另一个表用于探测阶段。在实施例中,无论是表还是输入行集合中具有较少行的那个被用作构建数据行110。用于指定哪个输入行集合被用作构建数据行110的其它准则包括:哪个输入行集合消耗更少的易失性存储器,哪个输入行集合具有更多的不同键值,以及哪个输入行集合具有更少的数据偏斜。在实施例中,维度表总是被用作构建数据行110。
[0113]
在构建场景314中,应当集成重复项,这需要调整桶y中的值a的现有条目。例如,散列表170的元素列可以代替地包含应当每次值a再次出现时递增一的值a的出现的计数。构建场景314跳过将在桶y中找到空位置的步骤304,因为构建场景314重用由步骤303找到的已经存在的值a的条目。
[0114]
如图1中所示,当值a再次出现时,构建场景315将重复值a的另一个条目插入到同一个桶y中。例如,响应180可以报告针对同一产品的不同购买订单。在任何情况下,构建场景315都需要如上所述的步骤303-305。
[0115]
在根据相应构建场景处理所有构建数据行b1-b3之后,完成散列表170的填充,并且步骤306发生。在大多数情况下,图2的探测过程可以或多或少地立即发生在步骤306之前。在该情况下,步骤306和图2的步骤208是发送回答相同请求150的相同响应180的相同步骤的相同出现。因此,可以组合步骤208和306以仅发送一个响应180。
[0116]
在实施例中,散列表170可以以各种方式被重用。例如,针对相同或不同请求的后续联接可以跳过构建阶段(图3),并且探测阶段(图2)将散列表170重用于相同或不同的探测数据行。例如,三个关系表a-c可以具有相似的联接列a-c,它们被用在两个等值联接的联合中,诸如a.a=b.b or a.a=c.c。在该情况下,表a可以被用在填充散列表170的构建阶段中,而剩余的两个表b-c可以用在相应单独的探测阶段中,这两个阶段都将相同的散列表170用于单独的相应联接。
[0117]
4.0示例联接键配置
[0118]
如本文前面所解释的,字段120和140用作联接键,其可以是构建键或探测键。取决于实施例和用例,可以以特定方式格式化和/或使用联接键,本文称为联接键配置。除了本文已经呈现的示例联接键之外,下面的表2列举了附加的示例联接键配置631-634,在各种实施例中,它们中的一些或全部可以由计算机100操作。
[0119]
联接键配置含义631分组键632复合候选键633不是候选键的(一个或多个)字段的集合634编码字典代码
[0120]
在联接键配置631中,字段120或140可以被用作分组键和联接键两者。例如,请求150可以是包含指定字段120的group by子句的sql,即使字段120不是诸如关系表的主键之类的候选键。分组键通常包含重复项。
[0121]
在联接键配置632中,同一个关系表或数据行集合(诸如110或130)的多个字段可以一起被用作复合候选键和复合联接键两者。当联接键是候选键时,不存在重复项,因为候选键应当唯一地识别各个行。在各种示例中,只有构建键是候选键,或者只有探测键是候选键,或者两者都不是候选键或两者都是候选键。在示例中,等值联接键:a)作为字段120和字段140出现,b)是维度表的候选键,但不是要联接到维度表的事实表的候选键,以及c)在事实表中有重复项,但在维度表中没有。
[0122]
在联接键配置633中,复合联接键不是候选键。在联接键配置634中,联接键被字典编码。联接键的每个不同的未编码值可以与相应的不同字典代码对应。在实施例中,未编码的值是稀疏的,而字典代码是密集的,诸如连续整数。
[0123]
5.0示例条目配置
[0124]
取决于实施例和用例,构建键条目可以被格式化和/或以特定方式使用,在本文中称为条目配置。如本文前面所解释的,桶可以存储相同或不同构建键值的多个条目。而且如本文前面所解释的,散列表170的各种实施例可以具有不同的相应构建键条目格式,这些构建键条目格式是或不是针对诸如散列码、重复项和指针之类的关注点而设计的。
[0125]
下面的表3列举了示例条目配置611-617,在各种实施例中,其中一些或全部可以由计算机100操作。附加条目配置将在后面呈现。
[0126]
条目配置含义611构建数据行的联接键值612联接键值的散列码613相同构建键值的重复出现的计数614构建数据行的(一个或多个)其它字段615对于为相同构建键值集成的重复项,重复行的另一个字段的极值616对于为相同构建键值集成的重复项,重复行的另一个字段的集中趋势617指向条目数据的指针
[0127]
条目配置611将构建键值的一些或所有比特直接存储在散列表170中的键条目内。在这种情况下,键条目至少包括散列表170中所示的构建键列。
[0128]
条目配置612将构建键值的散列码的一些或所有比特直接存储在散列表170中的键条目内。在一些情况下,散列码可以包含比构建键值更少的字节,诸如对于文本构建键值和整数散列码。在实施例中,当键条目包含散列码而不是构建键值时节省空间。
[0129]
在大多数情况下,依赖键条目中的散列码是不确切的,当不同的联接键值具有相同的散列码时,这可能造成冲突,并且也可能造成误命中(即,假肯定)。冲突可以要求附加的逻辑来消歧。在实施例中,消歧被委托给特定于应用的逻辑,该逻辑可以比较数据行110或130的其它字段以确立键条目实际表示哪个构建键值。在实施例中,键条目本身包含数据,诸如散列表170的元素列或指向构建数据行的指针或可以以通用方式用于由dbms本身自动消歧的其它数据。
[0130]
条目配置613直接在键条目中维护相同构建键值的重复出现的计数,诸如对于使用count和group by的sql。条目配置614将构建数据行110的(一个或多个)其它字段直接存储在键条目中,诸如主键或被物化的字段,诸如用于投影,诸如用于响应180或中间结果。如果当请求150具有诸如多路联接(诸如a.a=b.b=c.c)的多个联接时构建数据行110本身是更早联接的中间结果,那么键条目可以包含来自多个关系表的(一个或多个)字段。
[0131]
条目配置615-616通过集成到相同的键条目中来支持相同构建键值的重复出现,诸如对于sql group by,其具有诸如sum之类的sql聚合函数。条目配置615为具有相同构建键值的每个构建数据行维护另一个字段或计算的极值,诸如max。条目配置616为具有相同构建键值的每个构建数据行维护另一个字段或计算的集中趋势值,如stddev或avg。
[0132]
条目配置617存储指向构建数据行或与构建数据行相关联的其它数据的指针或偏移量。各种示例包括:a)指向行高速缓存中的数据行或缓冲区高速缓存中的数据库块的指针,b)持久的行标识符,诸如rowid,或c)到行标识符(诸如主键)的向量的易失性偏移量,或到同一关系表或行集合的imcu的集合的易失性偏移量。在实施例中,整数偏移量可以比指
针窄,或者指针可以是多字节对准的,使得最低有效比特总是:零、隐含、未存储和/或重新用作(一个或多个)比特字段。
[0133]
6.0示例桶配置
[0134]
图4是描绘用于散列表或如本文稍后呈现的另一种数据映射的示例分段和间接取值方案的框图。如图所示,键值(kv)表400可以是散列表或其它种类的数据映射。例如,kv表400可以是图1的散列表170的实施方式。
[0135]
下面的表4列举了示例桶配置621-623,在各种实施例中,其中的一些或全部可以结合到kv表400中。附加的桶配置将在后面呈现。
[0136]
桶配置含义621桶是分段数组622桶或分段不大于硬件高速缓存线623桶或分段与硬件高速缓存线具有相同的存储器地址对准
[0137]
在桶配置621中,每个桶可以是分段数组以适应溢出。如本文稍后讨论的桶分段与表分段不同,如下所述。
[0138]
在实施例中,kv表400是桶(诸如q-x)的数组,使得散列码或构建键值的一些或所有比特可以被用作数组中的索引以识别桶。在所示实施例中,kv表400是可扩展桶q-x的分段数组,使得每个表分段(诸如430)包含桶的数组。表分段430本身是存储器的连续区域,但是kv表400中的多个表分段可以彼此不连续或可以不彼此不连续。取决于实施例或场景,kv表400可以:总是包含相同的固定数量的表分段和基指针,或者在构建阶段期间根据需要增长附加的表分段和基指针。
[0139]
如图所示,kv表400具有四个表分段(包括430),每个表分段包含四个桶,使得kv表400总共包含4x4=十六个桶。例如,表分段包含彼此连续的桶q-t,并且另一个表分段包含桶u-x。如图所示,每个所示的基指针0-3指向kv表400中的相应表分段。例如,基指针1指向表分段430。以该种方式,kv表400可以是分段的散列表,这与具有分段的桶的散列表不同,但是散列表可以既是分段的并且具有分段的桶,如本文后面解释的。
[0140]
分段的散列表被分解成不相交的桶子集,使得在实施例中并且只要出现以下情况,每个表分段本身就可以是具有kv表400的桶的相应子集的较小散列表。例如,如图所示,kv表400具有四个分段,在实施例中,每个分段都可以用确保映射到散列表分段的相应桶子集的不同的键值子范围来构建和探测。这可能需要通过联接键值对构建和/或探测数据行进行水平分区。在实施例中,存在对称多处理(smp),诸如每个处理器核心具有一个或多个表分段以用于任务并行化。
[0141]
在未示出的实施例中,桶具有固定容量以包含多个构建键条目。在所示实施例中,桶具有或多或少的无限容量,可以根据需要一次分配一个桶分段。每个桶分段具有相同的容量来存储相同或不同构建键值的多个条目。
[0142]
取决于实施例,kv表400的桶q-x的数组:a)直接存储相同固定容量的每个桶,b)在所示实施例中,直接存储无限容量的每个桶的相同固定容量的相应第一分段,或c)间接存储指向无限容量的每个桶的相应第一分段的指针或偏移量。例如,对于所示的(b),表分段包含作为该表分段中每个桶的相应第一分段的桶分段,诸如桶分段440。例如,桶分段440和423可以按该顺序菊式链接,以标记为next的箭头示出,用以提供桶分段的链表来扩展桶的
存储容量。
[0143]
在所示实施例中,每个桶分段包含指向同一个桶的下一个分段的指针或偏移量,使得每个桶是基于桶分段的链表的分段数组。在实施例中,相同或不同散列表的所有桶的桶分段被预分配在相同的数组中,示为溢出桶分段410,其元素包括单独的溢出桶分段421-423,使得桶的链表中的链接可以是溢出桶分段410的数组的偏移量。例如,偏移量可以比地址指针窄。
[0144]
例如,溢出桶分段410可以作为池操作,备用桶分段可以从该池中取出并且稍后在kv表400被丢弃时返回。在实施例中,比特图指示哪些备用桶分段421-423当前参与任何桶的链表。在未示出的没有池的实施例中,同一各桶的桶分段具有指数级增加的容量(诸如二的幂),以在桶小时节省空间并在桶大时节省重复的分段分配时间。
[0145]
在桶配置622中,每个桶或桶分段具有相同的固定尺寸,该尺寸不大于硬件高速缓存线,诸如中央处理单元(cpu)或处理器核心的l1、l2或l3高速缓存,使得桶或桶分段始终可以放入硬件高速缓存线中。因此,被频繁访问的桶被高速缓存以利用时间局部性,诸如由于在构建阶段和/或探测阶段期间联接键值的数据偏斜。
[0146]
在桶配置623中,每个桶或桶分段具有与硬件高速缓存线相同的多字节存储器地址对准。例如,当硬件高速缓存线是64字节宽时,桶分段与64字节边界对准,使得桶分段地址的六个最低有效比特始终为:零、隐含、未存储和/或重新用作(一个或多个)比特字段。
[0147]
7.0预取(prefetch)数据的示例种类
[0148]
桶和散列表是聚合数据的数据结构,如本文前面所解释的。这些数据结构可以提供数据的规则组织,诸如当数据项具有统一的固定尺寸和/或地址对准时,这有助于数据并行化以用于加速,诸如对于向量处理。尤其是对于诸如simd操作之类的数据并行化,存储器时延可以降低吞吐量,这可以通过高速缓存将数据从主存储器预取到硬件高速缓存中来缓解。
[0149]
实施例可以使用软件预取,诸如对于指令集体系架构(isa)的预取指令。术语“步幅(stride)”是指被并发预取的字节或数据项的数量。dbms可以或可以不基于simd寄存器宽度和/或时间预测(诸如时钟周期,诸如基于静态或及时考虑机器指令序列和/或存储器等待状态)来计算步幅。在实施例中,步幅的分界由诸如查询编译器、字节码编译器和/或优化分析器之类的即时编译器计算。在实施例中,步幅分界是硬编码的,诸如在文本源代码中手工编码。
[0150]
下面的表5列举了预取数据641-644的示例种类,在各种实施例中,计算机100可以使用其中的一些或全部。在实施例中,预取数据641-644中的每一个是相同种类的多个数据项的步幅,诸如在存储器地址或数组内的偏移量处的水平和/或垂直切片。在实施例中,具有相同或不同步幅的多个项在主存储器中是连续的并且通过预取直接复制到硬件高速缓存中。
[0151]
预取数据含义641多个桶或桶分段642多个联接键值643多个联接键值的预先计算的散列码644rowid、主键或多个数据行的其它字段
[0152]
预取数据641是多个桶或多个桶的相应分段,其中任一个都具有相同的固定尺寸。预取数据642是数据行110或130的多个联接键值。不管如何计算多个联接键值的散列码,诸如是否并发计算,这些散列码随后都可以连续存储在提供预取数据643的存储器中。
[0153]
其它预取数据644可以与相应的数据行110或130相关联,诸如rowid、主键、其它字段或整个数据行本身。最终预取针对所有数据行110或130的数据项可以需要或可以不需要按顺序的多个步幅,并且定时可以是特定于应用的,使得前一个步幅不需要后面紧跟着下一个步幅,诸如当预取步幅时比处理步幅更快时。在实施例中,步幅预取和步幅处理发生在相同的计算线程和/或机器指令序列中。
[0154]
8.0散列联接操作的示例并行化
[0155]
如本文前面所解释的,构建阶段可以在桶内搜索以找到:a)重复构建键值的现有条目,或b)空位置。因此,构建阶段和探测阶段可能需要一些类似的查找活动。图5是描绘用于加速探测和/或构建的示例并行过程的流程图。参考图1来讨论图5。
[0156]
步骤501和503展示了流水线并行化的预取。如上所述,虽然最终以单次遍历所有数据行110或130,但预取大容量负载数据以保持硬件高速缓存温暖,否则即使用硬件高速缓存也会大大增加主存储器的可观察时延。以下示例预取提供了流水线并行化以提高吞吐量。
[0157]
步骤501和503中的每一个步骤分别需要以相同或不同的相应方式的相同或不同的相应种类的数据的至少两个步幅。步骤501预取一种数据项的当前步幅,同时处理同种数据项的先前步幅。如下面所讨论的,也可以同时预取多个相应种类数据项的步幅。
[0158]
步骤502并发地计算多个桶或桶分段的相应存储器地址,诸如通过下面讨论的simd、超标量或超流水线。步骤502可以并发地转化多个散列码或将键值联接到相应相同或不同桶的存储器地址。当多个相同或不同的散列码或联接键值属于同一个桶或分段时,步骤502计算重复地址。
[0159]
步骤503可以被实现为并发发生的步骤503a-503b(未示出)。可以同时预取一种数据项的步幅和另一种数据项的步幅。同时,步骤503a为一些多数据行预取相应的桶或分段,而步骤503b预取同一行集合的相同或其它多数据行的散列码或联接键值。例如,步骤503a可以使用由步骤502计算的桶或分段地址。通过快速相继地执行多个相应的预取指令可以或多或少地同时预取多个步幅,诸如当预取步幅比将多条指令放入cpu指令执行流水线时要慢时。
[0160]
步骤504执行各种cpu并行化指令之一以执行步骤504a-504c(未示出)中的相应一个步骤。步骤504a-504c是基于实施例的相互排斥的并发扫描方式。换句话说,实施例执行步骤504a-504c中的相应一个步骤。如本文所使用的,并发扫描不是线性扫描也不是顺序扫描。
[0161]
步骤504a执行指令集体系架构(isa)的个体单指令多数据(simd)指令,该指令并发地扫描同一个桶或桶分段中的多个键条目以找到:a)在构建阶段或探测阶段期间的给定联接键值的条目,或b)构建阶段期间桶或分段中的空位置。在实施例中,相同的simd指令在同一个桶的分段的链表中一个分段接一个地重复执行,直到找到给定的键条目或空位置或者链表中没有更多分段为止。
[0162]
超标量处理器并发地执行多个指令。在标量实施例中,这些相同的多个指令代替
地由标量处理器顺序执行。步骤504b由超标量处理器并发地执行多个指令,每个指令将相同或不同的键条目与同一个桶或分段的相应位置中的相应条目进行比较。例如,如果桶包含两个位置,每个位置可以由两个相似指令中的相应一个指令检查,那么超标量处理器并发地执行两个指令以并发地检查两个位置是否有给定的键条目或空位置。
[0163]
超流水线处理器:a)将cpu时钟周期划分为子周期,b)在同一cpu时钟周期期间并发地执行同一个指令的多个流水线阶段,以及c)在每个子周期发起另一个指令,使得执行在时间上部分重叠的许多指令。在另一个实施例中,这些相同的许多指令代替地仅在普通cpu上的相应cpu时钟周期处被分别发起。步骤504c由超流水线处理器并发地执行多个指令,每个指令将相同或不同的键条目与同一个桶或分段的相应位置中的相应条目进行比较。例如,如果桶包含两个位置,每个位置可以由两个相似指令中的相应指令检查,那么超流水线处理器并发地执行两个指令以并发地检查两个位置是否有给定的键条目或空位置。
[0164]
在实施例中,当桶是分段数组时,如上面所讨论的步骤502计算第一分段的地址。在实施例中,步骤504a依次使用各种simd指令来并发地遍历相应桶的分段的多个链表。
[0165]
在相同桶或不同桶中,当出现重复项时,步骤505并发地调整相同或不同构建键值的多个条目。例如,个体simd指令可以并发地更新直接或间接包含在多个键条目中的数据。
[0166]
9.0第一示例性实施例
[0167]
具有伪代码的以下示例性实施例展示了可以与本文前面呈现的一些或所有实施例一起使用的实施方式选择。这个示例性实施例的特征不是本文前面呈现的实施例的要求。
[0168]
这个示例性实施例展示了以下体系架构的中立性:a)具有simd处理通道和/或simd宽寄存器的cpu,b)主存储器,c)大容量存储数据格式,诸如行为主、列为主、关系模式和/或数据库块,以及d)多线程,诸如对于多核cpu。这个示例性实施例可以使用或者可以不使用intel cpu,诸如pentium 4或xeon,它们都具有提供数据并行化功能集的示例性simd指令集体系架构(isa),诸如多媒体扩展(mmx)、流式simd扩展(sse)和高级向量扩展(avx)。
[0169]
在多线程场景中,线程安全性可以通过以下方式确保:a)硬件同步,诸如原子指令或isa的高速缓存一致性指令,诸如存储器屏障或栅栏,b)软件同步,诸如互斥(mutex)、信号标、或临界区,或c)通过联接键值或散列码对数据进行水平分区,使得多个计算线程不会共享桶,诸如对于分区的散列表。例如,sql聚合函数可以依赖于诸如获取并添加(fetch-and-add)之类的原子指令,并且同一个桶的分段的菊链可以增长而不与比较和交换原子指令发生争用。
[0170]
9.1存储器中压缩单元
[0171]
那些是粗粒度线程并行化的示例,诸如对于可以补充和进一步加速simd或其它向量硬件的细粒度数据并行化的多核或超线程cpu。例如,每个计算线程可以异步地将相同的逻辑应用到在单独的相应存储器中压缩单元(imcu)中可用的数据行110或130的单独的相应子集。imcu包含来自数据库表或中间结果集的一个或多个列的连续存储的值。imcu的结构和操作如下。
[0172]
例如,在双格式数据库系统中,其中数据可以用于查询处理的格式之一是基于盘上格式的,而其中数据可用于查询处理的另一种格式是独立于盘上格式的。
[0173]
与盘上格式对应的格式在本文中被称为“持久格式”或“pf”。处于持久格式的数据
在本文被称为pf数据。独立于盘上格式的存储器格式被称为“镜像格式”或“mf”。处于镜像格式的数据在本文被称为mf数据。例如,在一个实施例中,持久格式是行为主盘块,而镜像格式是列为主格式。这种双格式数据库系统在标题为“mirroring,in memory,data from disk to improvement query performance”的编号为14/337,179的美国专利申请(以下简称“镜像申请”)中描述,该申请的内容通过引用并入本文。
[0174]
mf数据可以在易失性存储器内被组织成“存储器中压缩单元”(imcu),其包含(一个或多个)向量,该(一个或多个)向量包含来自行的同一集合或子集的一个或多个列的连续值。因此,imcu可以至少是数据库表的垂直切片,并且当imcu仅涉及行的子集时,imcu也是数据库表的水平切片。由于列值的列格式和连续存储,imcu可以促进数据并行化的向量处理,如下所示。此外,因为当相同的(一个或多个)列被水平切片(即,水平分区)为多个imcu时,这些imcu可以被视为列的分段,使得每个imcu可以由相应的处理器核心并发处理,如本文前面所讨论的。
[0175]
9.2并行化的多种协同形式
[0176]
无论是否在imcu中存储数据行110或130,散列表桶的尺寸设计为将未使用空间约束为由散列表消耗的总空间的指定部分,并且对于每个散列键值约束链接在一起的桶分段的最大数量。在这个设计中,散列桶的尺寸设计为高效地与存储器和向量体系架构交互。这意味着它们的尺寸固定在存储器检索到的单位(“高速缓存线尺寸”),并且散列表的尺寸被设置为使大多数探测器在一个桶分段检索中成功。
[0177]
这个组织有很多好处。首先,查找操作可以诸如通过预取有效地流水线化,因为从查找键值到桶的映射通常被正确预测并始终如一地执行。其次,因为每个查找键值都是独立的,所以当cpu具有超标量或者显式向量化或两者兼有时,可以并行进行这些映射中的多个映射。
[0178]
另一个重要的实施方式细节是,对于散列表的每个用例,诸如取决于联接键类型,桶的内部布局专门用于最大化它存储的键值的数量,并使用向量指令启用桶搜索。这导致其中执行在跨桶并行和桶内并行操作之间交替的执行模型,两者都在相同或不同的计算线程中使用simd,这最大化了存储器系统和cpu资源的利用。
[0179]
存在附加元素有助于提高设计的效率。跟随链不是本质上并行的操作,但可以从超标量执行和存储器预取中受益。在这种超可扩展的情况下,执行切换到串行模式(例如,如果在并行阶段中发现多个链,那么这些链被隐式地并行化)。
[0180]
因为输入键值是不可预测的,因此读取的桶也是如此,并且,对于主要驻留在主存储器中的大型散列表,读取随机数据的时延高。为了隐藏该时延,包括查找的操作被显式地流水线化。
[0181]
图6是描绘用于加速探测和/或构建的示例并行过程的流程图,该过程需要如下步骤601-605。参考图1来讨论图6。用于实现图6的过程的伪代码将在本文后面介绍。
[0182]
探测阶段或构建阶段可以具有多阶段处理流水线,使得每个阶段以不同的方式处理不同的相应数据步幅。在实施例中,步骤601-603为下一个步幅预取数据,而步骤604-605诸如以下分析当前步幅的数据。在实施例中,步骤601-605中的一些或全部可以通过使用simd指令来扩展以并发地处理相同种类的多个对象(诸如构建键值、散列码或桶地址)。
[0183]
为了展示,讨论了步骤601-605,而不涉及步幅和预取。步骤601通过将联接键值从
主存储器传送到调用堆栈或操作数堆栈上或cpu寄存器中来读取它们。步骤602将联接键值转换成桶地址。步骤603通过将桶或桶的相应第一分段从主存储器传送到调用堆栈或操作数堆栈上或cpu寄存器中来检索它们。
[0184]
步骤604并发地在桶中搜索匹配。例如,可以并发地将相同或不同的联接键值或散列码与多个桶(诸如散列表的同一表分段中的所有桶或桶分段)中的条目进行比较。步骤605并发地跟随用于不同桶的桶分段链。例如,可以并发地检查单独桶的相应第二桶分段,并且可以迭代地且并发地检查后续桶分段。
[0185]
显式流水线化意味着步骤601-603比604-605“领先”由cpu和存储器系统特点确定的步幅量,并且快速本地存储器中的缓冲区将它们连接起来。而且,如前面所解释的,步骤601-603是跨桶并行的,而步骤4在桶内是并行的(但可以是超规模的),而步骤605是串行的(但可以是超规模的)。
[0186]
改进的设计的主要结果是在构建阶段和/或探测阶段实现了非常高的联接查找率,这最小化了执行联接所需的时间。
[0187]
9.1探测操作的伪代码
[0188]
虽然构建阶段发生在用于散列联接的探测阶段之前,但这里在呈现用于构建阶段的伪代码之前呈现用于探测阶段的伪代码,因为在一些实施例中探测阶段可以没有构建阶段复杂。下面的伪代码可以实现散列联接的探测阶段。
[0189]
[0190][0191]
9.2构件操作的伪代码以下伪代码可以实现散列联接的构建阶段。
[0192]
[0193]
[0194][0195]
10.0示例数据映射选择
[0196]
使用如本文前面广泛讨论的散列表的散列联接只是实现关系联接的一种方式。执行联接的其它方式可以使用关联数据结构,诸如不是散列表且不使用散列的数据映射。因此,相同的联接可以具有基于各种替代数据映射的各种替代实施方式。每种可用的数据映射可以专门用于优化或以其它方式处理特定问题,诸如:联接键值数据类型和/或尺寸、重复项的可能性和/或处理、存储器需求和速度。例如,查询计划优化器可以动态地选择特定种类的数据映射来实现基于各种关注点和条件的联接,如本文稍后讨论的。
[0197]
图7是描绘实施例中的示例计算机700的框图。计算机700基于从多个种类的数据映射中的一个种类的数据映射的优化选择来联接数据行710和730。计算机700可以是至少一个机架式服务器,诸如刀片、个人计算机、大型机、虚拟计算机或其它计算设备。当计算机700包括多个计算机时,这些计算机通过通信网络互连。计算机700可以是计算机100的实施方式。
[0198]
请求750可以指定或以其它方式调用数据行710和730之间的关系联接。在实施例中,联接的执行可以依赖于用于做出构建数据行710到探测数据行730的匹配的(一个或多个)数据结构。在本文中,诸如761-762之类的各种种类的数据映射用于这种做出匹配。
[0199]
数据映射的种类761-762可以用逻辑和元数据来实现,这些逻辑和元数据可以作
为模板、类、原型或抽象数据类型(adt)来操作,(一个或多个)实例可以从其中生成。数据映射的种类761-762以不同方式实现并以不同方式执行。例如,可以针对各种相应的关注点或资源(诸如初始化时延、修改时延、读取时延、静态或堆存储器需求,和/或调用和操作数堆栈需求)以各种相应方式来优化各种种类的数据映射。
[0200]
可以以各种相应方式来优化各种种类的数据映射,以实现各种相应的加速,诸如硬件高速缓存、数据并行化、非弹性水平缩放(诸如使用多核中央处理单元(cpu))、弹性水平缩放、流水线并行化和/或协同处理(诸如通过图形处理单元(gpu))。可以针对各种相应使用情况和/或偏差(诸如数据偏斜)、数据库表扫描(诸如针对在线分析处理(olap))和/或随机访问(诸如针对在线事务处理(oltp)),以各种相应方式来优化各种种类的数据映射。可以针对各种相应的集成场景以各种相应的方式优化各种种类的数据映射,诸如分解成较小的组件(诸如经编译的查询操作符的部分)和/或部分或整个查询操作符的融合。
[0201]
可以针对诸如请求750之类的请求的各个相应方面以各种相应方式来优化各种种类的数据映射,诸如数据库模式细节,诸如表列的各方面(诸如数据类型、值范围)、数据约束(诸如参考完整性和独特性)。各种种类的数据映射可以针对各种相应的数据库优化以各种相应的方式被优化,诸如数据库索引、数据库块的缓冲区和高速缓存、数据压缩和编码,和/或存储器中压缩单元(imcu)。
[0202]
因此,计算机700应当使用多个种类的数据映射761-762中的哪一种来执行请求750可以取决于静态条件,诸如硬件和软件部署以及数据库配置和模式。数据映射的种类的选择还可以取决于或代替地取决于动态条件,诸如请求750的细节、数据行710和/或730的内容、高速缓存内容和/或硬件工作负载。在任何情况下,计算机700将静态和动态条件与各种种类的数据映射761-762的优势和劣势进行比较,以选择针对当前情境(context)或场景进行优化的特殊种类的数据映射761。
[0203]
在选择数据映射761的种类之后,计算机700生成实例770,该实例是数据映射761的种类的实例。实例770最初是空数据映射。相同种类的数据映射761的多个实例(诸如实例170)可以通过情境、配置和/或内容彼此区分。例如,可以用相同或不同的相应种类的数据映射的相应实例来执行两个相同或不同的查询(诸如请求750)。
[0204]
在这个示例中,构建数据行710被用于填充实例770。实例770和探测数据行730被用于做出匹配以履行联接。联接结果全部或部分地结合到回答请求750的响应780中或以其它方式用于生成该响应780。例如,数据映射的种类761可以是散列表变体(诸如本文早先呈现的)并且可以如本文早先呈现的那样被操作。本文稍后将呈现各种种类的数据映射,其中一些是散列表变体。
[0205]
如本文所使用的,数据映射的种类可以与诸如类、模板或原型之类的编程语言习语对应或可以不对应。在本文中,数据映射的种类之间的区别特征在于,一旦被完全或部分填充,数据映射的种类的实例就不应当成为不同种类的数据映射的实例。例如,实例不支持子类型迁移,诸如为了在不同种类的数据映射之间进行切换。
[0206]
例如,当两个不同种类的数据映射是共享相同实施方式类的变体时,这两个种类可以通过初始配置(诸如通过模板参数或构造函数参数)来区分,并且最初为这些参数给定的值不会在这些种类的相应实例的生命期间改变。例如,散列表的两个变体之间的唯一区别可以是指示一些寻常的事情(诸如散列表是否会或不会偶尔重新散列)的布尔参数。如果
对于这两个变体的相应两个实例,dbms最初且静态地将相反的布尔值指派给初始化参数并且决不会随后切换用于任何实例的指派,那么本文的方法可以将这两个变体视为可以从中生成多个实例的独立种类的数据映射。
[0207]
11.0示例构建过程
[0208]
图8是描绘计算机700的示例过程的流程图,该过程动态地选择多个种类的数据映射中的一个种类的数据映射来执行关系联接。参考图7讨论图8。
[0209]
步骤802接收指定或暗示数据行710和730的关系联接的请求750。例如,请求750可以是crud命令,诸如dml语句,诸如带有odbc的sql。
[0210]
步骤804从可以实现关系联接的多个种类的数据映射761-762中选择一种特定种类的数据映射761。例如,步骤804可以涉及将如上面所讨论的静态和动态条件与各种种类的数据映射761-762的优势和劣势进行比较,以选择针对情境或场景进行优化的特殊种类的数据映射761。选择准则和关注点在本文后面讨论。
[0211]
基于构建数据行710,步骤806创建并填充所选择种类的数据映射761的数据映射实例770。例如,步骤806可能需要如本文前面讨论的构建阶段。当步骤806完成时,数据映射实例770准备好用于做出匹配。
[0212]
取决于实施例和场景,数据行710和730可以在语义、格式和/或内容方面不同,但仍然可以对用于联接的相应数据集在某种程度上可互换。在实施例中,计算机100可以决定这两个数据集中的哪一个用于步骤806,并且另一个数据集将用于步骤808。
[0213]
步骤808发送响应780,该响应780基于探测数据行730和填充的数据映射实例770来回答请求750。例如,步骤808可能需要用于做出匹配的探测阶段,如本文前面所讨论的。例如,联接结果可以是在步骤808发送响应780之前进一步执行请求750的内部消耗的最终结果或中间结果。
[0214]
12.0示例配置关注点
[0215]
在呈现图9之前,以下可配置性讨论展示了可以设计稳健和高性能种类的数据映射的数据结构和格式。参考图7,下面的表6-8列举了在不同种类的数据映射之间可以不同的各种设计和实施方式选项。当为给定的情境、场景或条件选择最优种类的数据映射时,计算机700可以分析、平衡这些实施方式选项并将其匹配到各种种类的数据映射。
[0216]
在一些情况下,特定的列举选项可以使得在选择最优种类的数据映射期间排除一些种类的数据映射。在其它情况下,特定的列举选项可以使得在选择数据映射的种类是基于成本的或成本加权的情况下,一些种类的数据映射(诸如散列表的种类)在某种程度上被青睐。例如,保留重复的构建键值可以排除桶不扩展的散列表的种类和/或支持使用桶分段的散列表的种类。
[0217]
在一些情况下,特定的列举选项可以使得相同种类的数据映射761的不同实例(包括实例770)被不同地配置。在一些情况下,相同的列举选项可以使得在选择一个种类的数据映射时对数据映射的种类的实例进行特殊配置,而在代替地选择不同种类的数据映射时可以不需要实例配置。例如,一些种类的数据映射可以比其它种类的数据映射更具可配置性,而其它种类的数据映射可以在没有实例配置的情况下适应更广泛的场景。
[0218]
在一些情况下,这种灵活性也会影响选择哪种数据映射。例如,一个种类的散列表可以包括通用散列函数,而另一个种类的散列表可以被排除,除非为每个实例提供特定于
应用的散列函数。同样,可以排除另一个种类的散列表,除非特定于应用的散列函数提供完美的散列,使得不同的联接键值总是导致不同的散列码,并且不同键值的冲突是不可能的。
[0219]
在前面的表2-5中,本文早先呈现的附加列举的选项也会影响一个种类的数据映射和/或实例配置的选择。下面的表6列举了示例配置关注点931-934,在各种实施例中,这些配置关注点中的一些或全部可以结合到(一个或多个)种类的数据映射中。
[0220][0221]
配置关注点931-934一般如下呈现。配置关注点931-934的具体实施方式选项将在本文后面呈现。
[0222]
构建键的宽度是配置关注点931。例如,是否应当将散列函数应用于构建键值以及数据映射是否应当直接存储构建键值或者散列码可以取决于构建键尺寸(诸如当构建键可以是文本时)。
[0223]
配置关注点932取决于数据映射是否应当保留诸如构建数据行710的非键字段之类的附加数据,以及数据映射是否应当直接存储附加数据或代替地存储用于间接访问附加数据的指针或数组偏移量。
[0224]
配置关注点933取决于重复构建键值是否可能和/或重要。例如,检测和/或保留重复项可能带来时间和/或空间成本和/或结构复杂性。
[0225]
如本文前面和后面所讨论的,数据映射可以是包含桶和/或桶分段的散列表。即使在选择数据映射种类和/或配置实例770取决于其它关注点或场景时,配置关注点934也为桶或分段提供固定尺寸。例如,即使相同种类的数据映射761的多个实例(包括实例770)具有不同的相应构建键或散列码尺寸,数据映射761的种类也可以具有相同的固定桶分段尺寸。如本文稍后讨论的,要存储在构建键条目中的不同尺寸或包括的数据可能使得不同的相应种类的数据映射被选择以供使用。
[0226]
13.0示例桶布置
[0227]
不同种类的散列表可以具有不同的桶布置。实际上,一些种类的散列表没有桶,这与设计上每个桶只存储一个键条目相同,诸如对于布谷鸟散列(cuckoo hashing),这与每个桶分段只存储一个键条目不同。
[0228]
在实施例中,桶包含分段数组,该分段数组可以动态地获得附加分段,以便为桶提供或多或少的无限容量来存储构建键条目。例如,重复构建键值和/或将多个不同的构建键值映射到同一个桶的冲突可能增加对桶容量的需求。
[0229]
如本文前面所解释的,桶分段可以预先分配在池中,按需从池中获取,并且在实例770被丢弃时释放回池中。在实施例中,相同或不同种类的数据映射的不同实例共享相同的备用分段池。从池中获取并随后返回池是不需要分段的物理移动的逻辑过渡。
[0230]
换句话说,无论是否在使用中,分段在物理上都保持存储在作为池操作的分段的
数组的相同相应位置中。在实施例中,池中的每个分段可以基于分段的存储器地址或数组偏移量来识别。地址或偏移量可以作为指向分段的指针操作,诸如当分段出现在分段的链表(诸如用于桶的分段数组)中时。例如,分段可以包含指向链表中下一个和/或前一个分段的指针。
[0231]
14.0示例桶内容
[0232]
下面的表7列举了用于增加的吞吐量的流水线并行化的示例桶内容941-943,在各种实施例中,其中的一些或全部可以结合到(一个或多个)种类的数据映射中。
[0233]
桶内容含义941不存储键值942可变尺寸的键值943键值的散列码
[0234]
桶内容941不包括在桶中存储键值,诸如以下情况:a)散列冲突是不可能的,诸如对于完美的散列,或b)键值太大以至于无法直接存储在桶中。例如,文本键值和复合键值不需要直接存储在桶中,并且桶可以代替地存储这些数据的地址指针或数组偏移量。
[0235]
例如,指针可以提供对可变长度文本键值的间接取值,这些键值甚至可以是字符大对象(clob)。用于可变尺寸的键值的其它固定尺寸代理包括散列码和编码字典码。例如,桶内容943将散列码存储在桶中。
[0236]
当可变尺寸键值具有非常有限的尺寸时(诸如unicode字符或短文本(诸如股票代码符号)),那么桶内容942直接将键值内联存储在桶中。取决于实施例,内联在桶中的可变尺寸的短文本可以是空终止的,空白填充到固定尺寸,或者伴随有快速尺寸指示符(诸如字符计数)。
[0237]
15.0桶链化和池化
[0238]
如本文前面所讨论的,桶分段可以具有多字节对准的地址。因为物理分段可以是桶分段的数组,所以物理分段可以具有与数组中的第一个桶分段相同的地址和对准。而且如本文前面所讨论的,多字节对准的指针具有始终为以下的最低有效比特:零、隐含、未存储和/或重新用作(一个或多个)比特字段。因此,指向桶分段的指针可以被截断。
[0239]
锁定状态作为比特存储在桶分段指针的低比特中,将同一个桶的桶分段菊式链接到链表中。例如,图4示出了桶分段440和423通过桶分段指针next链接在一起。
[0240]
虽然桶分段指针next指向桶分段423,但是桶分段指针next存储在桶分段440内,如图所示。next中的锁定比特指示溢出桶分段423是被锁定还是解锁。同样,对于另一个桶,溢出桶分段421-422如桶分段指针所示链接,该桶分段指针包含指示溢出桶分段422是被锁定还是解锁的锁定比特。例如,相同或不同的计算线程可以具有为相同或不同的桶锁定的多个溢出桶分段,但是不同的桶不应当共享同一个桶分段。
[0241]
在实施例中,基指针0-3具有类似于桶分段指针的指针比特字段的指针比特字段。例如,基指针1的锁定比特指示表分段430(及其所有桶)是被锁定还是解锁。在实施例中,表分段430具有包含用于表分段430的桶的多个相应锁定比特的比特图。桶分段指针的低比特中的另一个比特记录所指向的溢出桶分段是否已经初始化,这促进初始化工作的线程化。
[0242]
在实施例中,溢出桶分段410本身是分段数组,其包含如图所示的多个池分段。每个池分段包含溢出桶分段的数组,如图所示。例如,溢出桶分段422-423在相同的池分段中,
但溢出桶分段421在不同的池分段中。桶可以包含相同或不同的池分段中的多个溢出桶分段。例如,溢出桶分段421-422是同一个桶的一部分,但在不同的池分段中。同样,溢出桶分段422-423在相同的池分段中,但在不同的桶中。
[0243]
桶分段可以适合硬件高速缓存线。在实施例中,表分段和/或池分段可以是物理分段。固定尺寸的物理分段可以包含多个固定尺寸的桶分段。在实施例中,表分段和池分段具有不同的相应固定容量,如图所示。
[0244]
即使物理分段的固定尺寸对于特定计算机和操作系统(os)而言可以是最高效的分配尺寸,但获得新的物理分段可能需要高时延存储器分配。可以从物理分段并以低时延分配桶分段。例如,物理分段可以作为桶分段的小池来操作。同样,可以存在物理分段池,其可以是池的池,诸如所示的包含两个池分段的溢出桶分段410,每个池分段本身是桶分段的小池。
[0245]
如本文前面所讨论的,桶分段可以具有多字节对准的地址。因为物理分段可以是桶分段的数组,因此物理分段可以具有与数组中的第一个桶分段相同的地址和对准。而且如本文前面所讨论的,多字节对准指针具有始终为以下的最低有效比特:零、隐含、未存储和/或重新用作(一个或多个)比特字段。因此,指向桶分段的指针可以是指向物理分段的截断的指针,其未使用的比特包括至少包含物理分段内的桶分段的数组偏移量的整数比特字段,并且可以仍有未使用的比特用于其它比特字段。在实施例中,数组偏移量比特字段附加地或可替代地包含在属于桶分段的键条目的散列码中。
[0246]
16.0第二示例性实施例
[0247]
图9是描绘计算机的动态地选择多个种类的数据映射中的一个种类的数据映射来执行关系联接的示例过程的流程图。图9的以下讨论描述了展示可以与本文前面呈现的一些或所有实施例一起使用的实施方式选项的示例性实施例。这个示例性实施例的特征不是本文前面呈现的实施例的要求。
[0248]
图9中所示的步骤是选择多个种类的数据映射中的一个种类的数据映射用于执行关系联接的不同的相应方式。在所示实施例中,这些步骤依次发生以逐渐排除各种类的数据映射,直到剩下一个或几个种类用于最终选择。在其它实施例中,这些步骤中的一些或全部被组合成单个步骤。
[0249]
可以针对各种相应使用情况和/或偏差(诸如数据偏斜)、数据库表扫描(诸如对于在线分析处理(olap))和/或随机访问(诸如对于在线事务处理(oltp)),以各种相应方式来优化各种种类的数据映射。正如本文前面所观察到的,准确预测联接选择性和构建表基数可能是困难的或不可能的,这可以是估计数据映射的数据分布作为建立数据映射的初始容量和配置的前言的关键因素。
[0250]
步骤902选择数据映射的种类而不考虑构建数据行的联接选择性或基数。例如,步骤902可以排除在选择性和/或基数未知时不适合的数据映射的种类。因此,步骤902容许丢失或陈旧的数据统计。
[0251]
步骤904选择数据映射的种类,其可以促进对字典编码的联接键值进行匹配而不需要对联接键值进行解码。例如,联接键值可以是字典代码,其也可以被用作数组的偏移量。例如,步骤904可以选择基于(一个或多个)数组的数据映射的种类。
[0252]
在这个示例性实施例中,除了各种种类的散列表之外,数据映射的种类还可以包
括数组表。散列表通常通过联接键值的散列码建立索引。而数组表是通过联接键值的编码字典代码建立索引的。
[0253]
16.1尺寸和对准
[0254]
在呈现步骤906之前,桶或桶分段的尺寸和对准可以被集成到各种种类的数据映射中,如下并参考图4,如本文前面讨论的。各种种类的数据映射可以包含如本文前面讨论的分段的桶。这个示例性实施例具有多线程的构建阶段,其中每个计算线程可以临时且单独地锁定桶分段以防止其它线程的干扰。例如,桶api可以具有子例程来导航分段的桶以及锁定和解锁各个桶分段。线程应当:仅在锁定桶分段之后将构建键条目添加到桶分段,并在之后立即解锁桶分段。
[0255]
这个示例性实施例支持以下三种散列表:
[0256]
·
kdzk_kv_generic:键值本身并不存储在桶中,而是其散列值的一部分被存储。因此查找是不确切的,但通常接近确切,因为所使用的散列比特数大。当键值复杂和/或大时,这种模式适用,并且客户端能够对结果进行后处理以确保确切匹配。允许重复的键值。
[0257]
·
kdzk_kv_gd:在这种模式下,键值始终为4字节并假设是非零,并且键值可以是编码字典代码。键值存储在kv表400中,因此查找是确切的。查找仍然需要散列值。允许重复的键值。
[0258]
·
kdzk_kv_direct:在这种模式下,供给的键值作为长度加上键值的字节存储在kv表400中。因此,键值的长度可以不同。查找是确切的,但查找仍然需要散列值。允许重复的键值。
[0259]
现在返回到图9,步骤906选择至少三种散列表(诸如kdzk_kv_generic、kdzk_kv_gd和kdzk_kv_direct)中的一种。
[0260]
如本文前面所解释的,桶或桶分段可以包含桶分段指针和键条目的数组。在各种示例中,键条目可以包含各种组件,诸如键值和/或可以具有各种尺寸的另一个值。在各种示例中,64字节桶或桶分段可以被配置用于各种尺寸的各种组件的各种组合。
[0261]
各种示例可以具有各种固定尺寸的构建键,诸如对于数字或字符串值。例如,日期键可以是两字节整数。月份名称键可以有十个字节,包括:a)指示字符串长度作为字符数的一个字节和最多九个字符,或b)根据需要包括空格填充的十个字符。
[0262]
下面的表8列举了桶或桶分段的预定义配置,每个这样的配置都有一种单独的数据映射。尺寸和对准是字节。因为桶分段指针的尺寸取决于桶分段指针是实现为指针还是如本文前面解释的偏移量,桶分段指针的实施方式可以影响桶或桶分段存储键值和/或其它值的容量。
[0263][0264]
桶配置1145-1146和1149在桶中存储键值但不存储其它值。桶配置1141-1152中的每一个可以被用于配置单独的相应种类的数据映射,诸如散列表。按照键尺寸,桶配置1141-1152提供五个种类的数据映射,它们具有2、4、6、8和10字节的五种相应键尺寸。按照值尺寸,桶配置1141-1152提供三个种类的数据映射,它们分别具有4或8个字节的或三种相应值尺寸或不存储值。通过桶对准,桶配置1141-1152提供三个种类的数据映射,分别具有2、4和8字节的三个相应对准。单独地,桶配置1141-1152是十二个不同种类的数据映射。
[0265]
取决于实施例,每个键条目都包含引用,该引用是数组偏移量或者是指针,在上表中分别示为索引-偏移量方法和存储器指针方法,它们是针对给定散列表的互斥的实施例。通过每个桶分段的键条目的量以及作为桶分段指针的物理分段的偏移量,桶配置1141-1152提供七个种类的数据映射,其具有3、4、5、6、7、10和15个键条目。通过以地址指针作为桶分段指针的每个桶分段的键条目的量,桶配置1141-1152提供六个种类的数据映射,其具有3、4、5、6、9和13个键条目的六个相应桶分段容量。
[0266]
kv表400的尺寸调整,诸如为了溢出或重新平衡,如下所示。为了增加kv表400的容量,通过扩展n比特来增加分段索引字段,这将散列表的分段的数量增加2n倍以上。
[0267]
一个现有桶中的条目被分成2n个桶。这种尺寸调整方案最小化争用,因此一个分段正在调整尺寸,而其它分段不会被阻止插入,因此调整尺寸和插入可以并行完成。
[0268]
17.0数据库概述
[0269]
本发明的实施例在数据库管理系统(dbms)的情境中使用。因此,提供了示例dbms的描述。
[0270]
一般而言,诸如数据库服务器之类的服务器是集成的软件组件和诸如存储器、节点以及节点上用于执行集成的软件组件的进程之类的计算资源的分配的组合,其中软件和
计算资源的组合专用于代表服务器的客户端提供特定类型的功能。数据库服务器控制并促进对特定数据库的访问,处理客户端访问数据库的请求。
[0271]
用户通过向数据库服务器提交使数据库服务器对存储在数据库中的数据执行操作的命令来与dbms的数据库服务器进行交互。用户可以是在与数据库服务器进行交互的客户端计算机上运行的一个或多个应用。多个用户在本文中也可以被统称为用户。
[0272]
数据库包括数据和数据库字典,其存储在诸如硬盘集合之类的持久性存储器机构上。数据库由其自己的单独数据库字典定义。数据库字典包括定义数据库中包含的数据库对象的元数据。实际上,数据库字典定义了许多数据库。数据库对象包括表、表列和表空间。表空间是用于存储各种类型的数据库对象(诸如表)的数据的一个或多个文件的集合。如果将用于数据库对象的数据存储在表空间中,那么数据库字典将数据库对象映射到保持用于数据库对象的数据的一个或多个表空间。
[0273]
dbms参考数据库字典来确定如何执行提交给dbms的数据库命令。数据库命令可以访问由字典定义的数据库对象。
[0274]
数据库命令可以是数据库语句的形式。为了使数据库服务器处理数据库语句,数据库语句必须符合数据库服务器支持的数据库语言。许多数据库服务器支持的数据库语言的一个非限制性示例是sql,包括由诸如oracle之类的数据库服务器支持的sql专有形式(诸如,oracle database 11g)。将sql数据定义语言(“ddl”)指令发布到数据库服务器以创建或配置数据库对象,诸如表、视图或复杂类型。数据操纵语言(“dml”)指令被发布给dbms,以管理存储在数据库结构内的数据。例如,select、insert、update和delete是一些sql实施方式中常见的dml指令示例。sql/xml是在对象-关系数据库中操纵xml数据时使用的sql的常见扩展。
[0275]
多节点数据库管理系统由互连的节点组成,这些节点共享对同一数据库的访问。通常,节点经由网络互连,并在不同程度上共享对共享存储装置的访问,诸如对一组盘驱动器和存储在其上的数据块的共享访问。多节点数据库系统中的节点可以是经由网络互连的一组计算机(诸如工作站和/或个人计算机)的形式。可替代地,节点可以是网格的节点,该网格由与机架上的其它服务器刀片互连的服务器刀片形式的节点组成。
[0276]
多节点数据库系统中的每个节点都托管数据库服务器。服务器(诸如数据库服务器)是集成的软件组件和计算资源(诸如存储器、节点以及节点上用于在处理器上执行集成的软件组件的进程)的分配的组合,软件和计算资源的组合专用于代表一个或多个客户端执行特定功能。
[0277]
可以分配来自多节点数据库系统中多个节点的资源,以运行特定的数据库服务器的软件。软件和节点中的资源的分配的每种组合都是在本文中被称为“服务器实例”或“实例”的服务器。数据库服务器可以包括多个数据库实例,其中一些或全部在单独的计算机(包括单独的服务器刀片)上运行。
[0278]
17.1查询处理
[0279]
查询是表达式、命令或命令集,其在被执行时,使服务器对数据集执行一个或多个操作。查询可以指定要从中确定(一个或多个)结果集的(一个或多个)源数据对象,诸如(一个或多个)表、(一个或多个)列、(一个或多个)视图或(一个或多个)快照。例如,(一个或多个)源数据对象可以出现在结构化查询语言(“sql”)查询的from子句中。sql是用于查询数
据库对象的众所周知的示例语言。如本文所使用的,术语“查询”被用于指表示查询的任何形式,包括数据库语句形式的查询和用于内部查询表示的任何数据结构。术语“表”是指被查询引用或定义并且表示行的集合(诸如数据库表、视图或内联查询块(诸如内联视图或子查询))的任何源对象。
[0280]
查询可以在(一个或多个)对象被加载时逐行地对来自源数据对象的数据执行操作,或者在(一个或多个)对象已经被加载之后对整个(一个或多个)源数据对象执行操作。由一些操作生成的结果集可以让(一个或多个)其它操作可用,并且以这种方式,可以基于某些准则将结果集过滤掉或缩小范围,和/或与(一个或多个)其它结果集和/或(一个或多个)其它源数据对象联接或组合。
[0281]
子查询是查询的一部分或组成部分,它与查询的其它(一个或多个)部分或(一个或多个)组成部分不同,并且可以与查询的其它(一个或多个)部分或(一个或多个)组成部分分开评估(即,作为单独的查询)。查询的其它(一个或多个)部分或(一个或多个)组成部分可以形成外部查询,其可以包括也可以不包括其它子查询。嵌套在外部查询中的子查询可以被单独评估一次或多次,同时为外部查询计算结果。
[0282]
一般而言,查询解析器接收查询语句并生成查询语句的内部查询表示。通常,内部查询表示是互连的数据结构的集合,其表示查询语句的各种组件和结构。
[0283]
内部查询表示可以是节点图的形式,每个互连的数据结构与节点和所表示的查询语句的组件对应。内部表示通常在存储器中生成,以用于评估、操作和变换。
[0284]
硬件概述
[0285]
根据一个实施例,本文描述的技术由一个或多个专用计算设备实现。专用计算设备可以是硬连线的以执行这些技术,或者可以包括数字电子设备(诸如被持久地编程为执行这些技术的一个或多个专用集成电路(asic)或现场可编程门阵列(fpga)),或者可以包括被编程为根据固件、存储器、其它存储装置或组合中的程序指令执行这些技术的一个或多个通用硬件处理器。这种专用计算设备还可以将定制的硬连线逻辑、asic或fpga与定制编程相结合,以实现这些技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持设备、联网设备或者结合硬连线和/或程序逻辑以实现这些技术的任何其它设备。
[0286]
例如,图10是图示可以在其上实现本发明实施例的计算机系统1000的框图。计算机系统1000包括总线1002或用于传送信息的其它通信机制,以及与总线1002耦合用于处理信息的硬件处理器1004。硬件处理器1004可以是例如通用微处理器。
[0287]
计算机系统1000还包括耦合到总线1002用于存储将由处理器1004执行的信息和指令的主存储器1006,诸如随机存取存储器(ram)或其它动态存储设备。主存储器1006还可以用于存储在执行由处理器1004执行的指令期间的临时变量或其它中间信息。这些指令当存储在处理器1004可访问的非瞬态存储介质中时,使得计算机系统1000成为被定制以执行指令中指定的操作的专用机器。
[0288]
计算机系统1000还包括耦合到总线1002用于存储用于处理器1004的静态信息和指令的只读存储器(rom)1008或其它静态存储设备。提供存储设备1010(诸如磁盘、光盘或固态驱动器)并将其耦合到总线1002,用于存储信息和指令。
[0289]
计算机系统1000可以经由总线1002耦合到显示器1012(诸如阴极射线管(crt)),用于向计算机用户显示信息。包括字母数字键和其它键的输入设备1014耦合到总线1002,
用于将信息和命令选择传送到处理器1004。另一种类型的用户输入设备是光标控件1016(诸如鼠标、轨迹球或光标方向键),用于将方向信息和命令选择传送到处理器1004并用于控制显示器1012上的光标移动。这种输入设备通常在两个轴(第一轴(例如,x)和第二轴(例如,y))上具有两个自由度,这允许设备指定平面中的位置。
[0290]
计算机系统1000可以使用定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑(它们与计算机系统相结合,使计算机系统1000成为或将计算机系统1000编程为专用机器)来实现本文所述的技术。根据一个实施例,响应于处理器1004执行包含在主存储器1006中的一个或多个指令的一个或多个序列,计算机系统1000执行本文的技术。这些指令可以从另一个存储介质(诸如存储设备1010)读入到主存储器1006中。包含在主存储器1006中的指令序列的执行使得处理器1004执行本文所述的处理步骤。在替代实施例中,可以使用硬连线的电路系统代替软件指令或与软件指令组合。
[0291]
如本文使用的术语“存储介质”是指存储使机器以特定方式操作的数据和/或指令的任何非瞬态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘、磁盘或固态驱动器,诸如存储设备1010。易失性介质包括动态存储器,诸如主存储器1006。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带或任何其它磁数据存储介质、cd-rom、任何其它光学数据存储介质、具有孔图案的任何物理介质、ram、prom和eprom、flash-eprom、nvram、任何其它存储器芯片或盒式磁带。
[0292]
存储介质不同于传输介质但可以与传输介质结合使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴线缆、铜线和光纤,包括包含总线1002的导线。传输介质也可以采用声波或光波的形式,诸如在无线电波和红外数据通信期间生成的那些波。
[0293]
各种形式的介质可以参与将一个或多个指令的一个或多个序列携带到处理器1004以供执行。例如,指令最初可以在远程计算机的磁盘或固态驱动器上携带。远程计算机可以将指令加载到其动态存储器中,并使用调制解调器通过电话线发送指令。计算机系统1000本地的调制解调器可以经电话线接收数据并使用红外发送器将数据转换成红外信号。红外检测器可以接收红外信号中携带的数据,并且适当的电路系统可以将数据放在总线1002上。总线1002将数据传送到主存储器1006,处理器1004从主存储器1006检索并执行指令。由主存储器1006接收的指令可以可选地在由处理器1004执行之前或之后存储在存储设备1010上。
[0294]
计算机系统1000还包括耦合到总线1002的通信接口1018。通信接口1018提供耦合到网络链路1020的双向数据通信,其中网络链路1020连接到本地网络1022。例如,通信接口1018可以是集成服务数字网(isdn)卡、线缆调制解调器、卫星调制解调器或者提供与对应类型的电话线的数据通信连接的调制解调器。作为另一个示例,通信接口1018可以是局域网(lan)卡,以提供与兼容lan的数据通信连接。还可以实现无线链路。在任何此类实现中,通信接口1018都发送和接收携带表示各种类型信息的数字数据流的电信号、电磁信号或光信号。
[0295]
网络链路1020通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路1020可以提供通过本地网络1022到主计算机1024或到由互联网服务提供商(isp)1026操作的数据设备的连接。isp 1026进而通过全球分组数据通信网络(现在通常称为“互联网”1028)提供数据通信服务。本地网络1022和互联网1028两者都使用携带数字数据流的
1130可以在某些情况下向客人操作系统提供半虚拟化。
[0307]
计算机系统进程包括硬件处理器时间的分配,以及存储器的分配(物理和/或虚拟)、正在用于存储由硬件处理器执行的指令的存储器的分配,以用于存储由硬件处理器执行指令所生成的数据,和/或用于当计算机系统进程未运行时在硬件处理器时间的分配之间存储硬件处理器状态(例如,寄存器的内容)。计算机系统进程在操作系统的控制下运行,并且可以在计算机系统上执行的其它程序的控制下运行。
[0308]
云计算
[0309]
本文一般地使用术语“云计算”来描述计算模型,该计算模型使得能够按需访问计算资源的共享池(诸如计算机网络、服务器、软件应用和服务),并且其允许以最少的管理工作或服务提供商交互来快速提供资源和释放资源。
[0310]
云计算环境(有时称为云环境或云)可以以各种不同方式实现,以最好地适应不同要求。例如,在公共云环境中,底层计算基础设施由组织拥有,该组织使其云服务可供其它组织或公众使用。相反,私有云环境一般旨在仅供单个组织使用或在单个组织内使用。社区云旨在由社区内的若干组织共享;而混合云包括通过数据和应用可移植性绑定在一起的两种或更多种类型的云(例如,私有、社区或公共)。
[0311]
一般而言,云计算模型使得先前可能由组织自己的信息技术部门提供的那些职责中的一些代替地作为云环境内的服务层来输送,以供消费者使用(根据云的公共/私有性质,在组织内部或外部)。取决于特定实现,由每个云服务层提供或在每个云服务层内提供的组件或特征的精确定义可以有所不同,但常见示例包括:软件即服务(saas),其中消费者使用在云基础设施上运行的软件应用,同时saas提供者管理或控制底层云基础设施和应用。平台即服务(paas),其中消费者可以使用由paas提供者支持的软件编程语言和开发工具,以开发、部署和以其它方式控制它们自己的应用,同时paas提供者管理或控制云环境的其它方面(即,运行时执行环境下的一切)。基础设施即服务(iaas),其中消费者可以部署和运行任意软件应用,和/或提供进程、存储装置、网络和其它基础计算资源,同时iaas提供者管理或控制底层物理云基础设施(即,操作系统层下的一切)。数据库即服务(dbaas),其中消费者使用在云基础设施上运行的数据库服务器或数据库管理系统,同时dbaas提供者管理或控制底层云基础设施和应用。
[0312]
为了说明可以用于实现(一个或多个)示例实施例的基本底层计算机组件而呈现了上述基本计算机硬件和软件以及云计算环境。但是,(一个或多个)示例实施例不必限于任何特定的计算环境或计算设备配置。代替地,根据本公开,(一个或多个)示例实施例可以在本领域技术人员将理解为能够支持本文呈现的(一个或多个)示例实施例的特征和功能的任何类型的系统体系架构或处理环境中实现。
[0313]
在前述说明书中,已经参考许多具体细节描述了本发明的实施例,这些具体细节可能因实施方案而不同。因此,应当在说明性而不是限制性的意义上看待说明书和附图。本发明范围的唯一且排他的指示以及申请人意在要作为本发明范围的是以由本技术产生的一组权利要求的具体形式的所产生权利要求的字面和等同范围,包括任何后续的校正。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献