用于更高效地使用存储器至cpu带宽的技术的制作方法

文档序号:6497909阅读:128来源:国知局
用于更高效地使用存储器至cpu带宽的技术的制作方法
【专利摘要】提供了在数据库操作的执行过程中更有效地使用CPU和易失性存储器之间的I/O路径带宽的技术。关系表格中的关系型数据作为列向量存储在易失性存储器中,每个列向量包含表格的特定列的值。不论与列相关联的数据类型是什么,可使用二进制可比较格式表示列向量内的每个值。在易失性存储器中时,列向量可被压缩和/或编码,并且在CPU中在飞行中被解压缩/解码。可替换地,CPU可设计为对压缩和/或编码的列向量数据直接执行操作。另外,描述了使CPU能对列向量值执行向量处理操作的技术。
【专利说明】用于更高效地使用存储器至CPU带宽的技术
[0001]相关申请的交叉引用;权益声明
[0002]本申请主张2012年10月2日提交的临时申请61/709142和2011年12月8日提交的临时申请61/568644的权益,根据U.S.C § 119 (e),通过引用将二者的整体内容合并于此,如同在本文中完整阐述一样。
[0003]本申请还涉及与本申请同日提交的题为“TECHNIQUES FORMA INTAI NI NG COLUMN
VECTORS OF RELAT1NAL DATAffITHIN VOLATILE MEMORY” 的美国专利申请 N0.__(代理
案号50277-4068),通过引用将其内容合并于此,如同在本文中完整阐述一样。
【技术领域】
[0004]本发明涉及关系型数据库系统,更特别地,涉及用于在易失性存储器中以提高数据库操作效率的方式存储逻辑上存在于关系型结构中的数据的技术。
【背景技术】
[0005]关系型数据库系统将数据存储在诸如表和索引之类的关系型结构中。然而,存储、检索和操纵数据的实际格式通常与表的逻辑结构没有关系。
[0006]例如,图1是常规关系表格100的方框图。关系表格100包括行rl至r8和列cl至c5。每行一般对应于一逻辑实体,每列对应于该实体的一属性。例如,在雇员表格中,每行可对应于一雇员,每列可对应于不同的雇员属性(姓名、年龄、薪水、电话号码等)。
[0007]行和列的交叉点定义一单元。存储在给定单元内的值是用于与所述行相关联的实体的、与所述列相关联的属性的值。例如,假设行r2与名为“Mary”的雇员相关联,并且列c2用于属性“age”。在这种情况下,存储在由行r2和列c2形成的单元内的值(以r2c2示出)可以是17,指示Mary是17岁。
[0008]已经开发了各种数据库语言以便容易地存取由关系型数据库系统管理的数据。一种常见的数据库语言是SQL。这种语言允许用户形成对数据进行引用的查询,就像数据实际上存储在关系型结构中那样。然而,存储和访问关系型数据的实际结构通常比简单二维表格复杂得多。
[0009]例如,图2示出了表格100中的数据实际上可由关系型数据库系统如何存储在盘200上。如图2所示,表格的数据散布在若干盘块(disk block) 202、212和222上。在盘块内,任意给定行的数据一般连续存储。每行的数据连续存储的存储格式被称为“行优先格式”。例如,行rl的各列的值连续存储在盘块202内。
[0010]然而,诸如行r3和r5之类的某些行的值可能实际上跨越两个盘块。例如,行r3的列cl和c2的值处于盘块202中,而行r3的列c3、c4和c5的值处于盘块212中。
[0011]存储任意给定表格的数据的盘块可以按非特定顺序散布在盘各处。每个盘块一般具有存储逻辑填充表格的实际值(“关系型数据”)的部分以及存储关于关系型数据的元数据的头部。例如,盘块202、212和222分别具有头部204、214和224以及关系型数据部分 206、216 和 226。1996 年 3 月 11 日提交的题为 “Method and Apparatus for ProvidingIsolat1n Levels in a Database System” 的美国专利 N0.5870758 中不出 了可以在盘块内如何组织关系型数据的例子。
[0012]图3是可管理对表格100的访问的典型数据库系统300的框图。参考图3,典型的数据库系统300包括存储子系统320,数据库系统300管理的数据持久地存储于其上。在图3所示的数据库系统300中,存储子系统320包括包含存储表格100的关系型数据的盘块 202,212 和 222 的盘 200。
[0013]除了存储子系统320之外,数据库系统300包括易失性存储器330和CPU340。典型地,用于存储关系型数据的持久储存器的大小显著大于当数据是数据库命令的目标时数据必须被载入其中的易失性存储器330的大小。因此,关系数据库服务器一般采用缓冲高速缓存332,数据库服务器334将包含作为数据库操作的目标的数据的盘块的拷贝暂时存储在缓冲高速缓存332中。如图3所示,响应于盘块202内的某些数据是一操作的目标,盘块202的拷贝被加载到缓冲高速缓存332中。
[0014]当数据库服务器334执行以存储在不同盘块内的数据为目标的操作时,缓冲高速缓存332被这些盘块的拷贝填充。一旦缓冲高速缓存332被填满,将尚未加载的盘块加载到易失性存储器中就涉及替换先前加载到易失性存储器中的盘块拷贝。如果正被替换的盘块拷贝已经改变,则该盘块拷贝的数据一般需要被回冲到盘。
[0015]因为通过I/O路径360在易失性存储器330和盘之间移动数据比通过I/O路径350在易失性存储器330和CPU340之间移动数据慢几个数量级,所以关系型数据库系统关注最小化在存储子系统320和易失性存储器330之间发生的I/O量。例如,在题为“SelectivelyReading Data From Cache And Primary Storage” 的美国专利申请 N0.12/691146 中描述了智能地缓存关系型数据的各种技术。作为另一个例子,在题为“Structure Of HierarchicalCompressed Data Structure For Tabular Data”的美国专利申请 N0.12/617669 中描述了用于压缩盘200上的关系型数据从而相同1/0通信量的路径360可以移动更多数据的各种技术。
[0016]不幸地,最小化1/0路径360上的通信量的技术可能导致1/0路径350的欠佳使用。例如,因为存储在缓冲高速缓存332中的盘块拷贝与盘200上的盘块具有基本相同的尺寸、内容和组织,所以可以用最少的变换在易失性存储器330和盘200之间传输关系型数据。然而,一旦在易失性存储器330中,则该相同盘块格式可能成为数据库操作的有效处理的障碍。
[0017]例如,查询“select clfrom emp where c2>30”请求检索c2中的值大于30的所有行中的列Cl的值。执行该查询实际所需的数据仅是emp表格的列Cl和c2的数据。换言之,为了执行所请求的操作,列Cl和c2的值是CPU340仅需查看的值。然而,因为关系型数据存储为缓冲高速缓存332内的盘块拷贝,并且在这些盘块拷贝内数据以行优先格式存储,所以大量无关数据将通过1/0路径350到达CPU340以便获得执行该操作所需的数据。在某些情况下,仅为了使CPU340能够执行涉及仅一或两列的值的操作,可能数百列的值必须流过1/0路径350。
[0018]本节中描述的方案是可以寻求的方案,但是不一定是先前构思或寻求过的方案。因此,除非另外指出,否则不应假定本节描述的任意方案仅由于它们被包括在本节中而被限定为现有技术。【专利附图】

【附图说明】
[0019]在附图中:
[0020]图1是示出如何逻辑地组织关系表格的框图;
[0021]图2是示出关系表格的关系型数据的典型盘上组织的框图;
[0022]图3是示出典型的关系型数据库系统的框图;
[0023]图4是示出根据本发明一实施例在易失性存储器内的列向量中存储关系型数据的框图;
[0024]图5是示出两个字节可比较的值之间的比较的框图;
[0025]图6是示出根据本发明一实施例的CPU的框图,该CPU包括用于执行可变长度列值的芯片上填充以产生可用于向量处理操作的定长值的转换逻辑器;
[0026]图7是示出根据本发明一实施例的CPU的框图,该CPU配置为直接对可变长度值执行向量处理操作;
[0027]图8是示出长度向量的框图,长度向量指示存储可变长度值的列向量的各个列值的长度;
[0028]图9是其上可实施本发明的实施例的计算机系统的框图;
[0029]图10是示出根据本发明一实施例在CPU中执行芯片上解压的步骤的流程图,该CPU不具有用于执行芯片上解压的专用硬件;
[0030]图11是示出根据本发明一实施例直接对压缩值执行向量处理操作的步骤的流程图;以及
[0031]图12是示出根据本发明一实施例在CPU中执行芯片上填充的步骤的流程图,该CPU不具有用于执行芯片上填充的专用硬件。
【具体实施方式】
[0032]在下面的说明中,出于解释的目的,阐述了许多细节以便提供对本发明的彻底理解。然而很明显,可以实现本发明而没有这些特定细节。在其它情况下,以框图形式示出了公知的结构和设备以便避免不必要地模糊本发明。
[0033]一般概述
[0034]提供了在数据库操作的执行过程中更有效地使用CPU和易失性存储器之间的I/O路径的带宽的技术。例如,提供了以减少必须在CPU和易失性存储器之间传输以执行数据库操作的数据量的方式在易失性存储器中组织关系型数据的技术。
[0035]在一实施例中,关系表格的关系型数据作为列向量存储在易失性存储器中,其中每个列向量包含该表格的特定列的值。列向量内的各个值能以各种格式表不。在一实施例中,不论与该列相关联的数据类型如何,使用二进制可比较格式来表示列向量内的每个值。
[0036]列向量在易失性存储器中时可被压缩和/或编码,在CPU中可在飞行中(on-the-fly)被解压缩/解码。可替换地,CPU可设计为直接对压缩和/或编码的列向量数据执行操作。另外,描述了使得CPU能够利用向量处理在单个指令中对相同列的多个值执行相同操作的技术。通过使用向量处理来对给定列的多个值同时执行相同操作,CPU具有更大能力以便应对以更大的速率向CPU馈送CPU必须对其进行操作的列值。[0037]列向量
[0038]图4是示出根据本发明一实施例可以如何在易失性存储器中存储关系型数据的框图。如图4所示,在易失性存储器330内,关系型数据组织成列向量,每个列向量连续地存储逻辑地填充表格100的对应列的值。
[0039]特别地,在图4所示的例子中,易失性存储器存储分别对应于图1所示的表格100的列Cl、c2、c3、c4和c5的列向量402、404、406、408和410。与图3的易失性存储器330所示的关系型数据的基于块的组织不同,图4的易失性存储器330所示的关系型数据的列向量组织与关系型数据通常在盘上如何组织没有类似之处。
[0040]由于关系型数据通常在盘上如何存储与关系型数据的列向量组织之间的差异,在系统启动时可消耗大量开销以在易失性存储器330内将关系型数据加载和组织到列向量中。然而,任何这种开销可在数据库操作的执行过程中由于将关系型数据保持在列向量格式而导致的对I/O路径350的更有效的利用而被抵销或更甚。另外,通过在盘上以列优先格式存储关系型数据,使得在易失性存储器330内创建列向量需要最少的数据重布置,可以减小该开销。
[0041]关系型数据的列向量组织在关系型数据很少(如果有的话)需要被交换出易失性存储器330以便腾出空间来加载来自盘的其它关系型数据的情况下特别有用。例如,在易失性存储器的量足以保持操作针对的全部表列的系统中,关系型数据的列向量组织特别有用。进一步地,如果易失性存储器的量足以保持由数据库服务器334管理的整个数据库,则易失性存储器330可视为关系型数据的主存储器(与高速缓存相对),其中盘存储器仅用于初始加载和备份。即使在不能将整个表装入存储器的情况下,表的一部分被装入易失性存储器,此处描述的技术可应用于装入存储器的部分。
[0042]因为数据以列向量格式组织,所以类似的数据项彼此相邻,这允许使用某些压缩格式(例如RLE),并且一般将产生更好的压缩。这些压缩格式允许在存储器中保持更多数据,并且还使得对存储器内的数据的查询能更快地运行。
[0043]CPU和易失性存储器之间的I/O路径的有效使用
[0044]在易失性存储器内以列向量格式存储关系型数据导致在数据库操作的执行过程中对I/O路径350的更有效的使用。通过增大向CPU340馈送特定数据库操作所需的实际值的速度,实现了改善的效率。向CPU340馈送数据库操作所需的值越快,数据库操作就执行得越快。
[0045]在一时钟周期内CPU可在I/O路径350上抓取的数据量被称为缓存线(cacheline)。由于缓存线的尺寸和CPU340的时钟速率二者都由硬件规定,所以I/O路径350上可获得的带宽通常保持恒定。
[0046]因此,增大CPU340接收数据库操作所需数据的速率涉及增加固定带宽的用于传输所执行的操作所需的信息的百分比。I/O路径350的带宽的用于传输相关信息的百分比在此处被称为“相关百分比”。
[0047]当关系型数据以基于块的格式存储在易失性存储器330中时,如图3所示,相关百分比可能非常低。例如,假设易失性存储器330以基于块的格式存储表格100的数据,并且数据库服务器334正在执行查询“select clfrom emp where c2>30”。
[0048]为了执行该操作,CPU340必须将列c2中的所有值与数字30进行比较。假设表格100中的所有值尺寸相同,并且CPU340的缓存线足以容纳表格100中的5个值。在这些情况下,从基于块的格式抓取c2的值需要8个时钟周期。在这8个时钟周期的每个内,CPU340将抓取一行值。例如,在第一时钟周期期间,CPU340抓取rlcl、rlc2、rlc3、rlc4和rlc5。在第二时钟周期期间,CPU340抓取r2cl、r2c2、r2c3、r2c4和r2c5,等等。在这8个时钟周期的每个内,相关比为20%,因为仅列c2的值与正在执行的操作相关,而列c2的值仅使用缓存线的1/5。缓存线的其余4/5用于传输与正在执行的操作无关的其他列的值。
[0049]相反,从图4所示的列向量格式抓取c2的值将仅用2个时钟周期。在第一时钟周期,列向量404的前5个值(rlc2、r2c2、r3c2、r4c2和r5c2)被抓取到CPU340中。在第二时钟周期,将抓取其余3个值(r6c2、r7c2、r8c2)。在这个例子中,在第一时钟周期期间的相关比是100%,在第二时钟周期期间为60%。另外,所需数据在关系型数据以基于块的格式存储时所需时间的1/4内被提供给CPU340。
[0050]字节可比较值格式
[0051]如上所示,在易失性存储器330中以列向量格式存储关系型数据允许与以行优先的基于块的格式组织关系型数据时相比快很多地将操作所需的数据馈送到CPU340。然而,如果CPU340不能以提供相关值的速率处理相关值,则可能损失以列向量格式组织关系型数据所获得的许多效率。
[0052]因此,根据一实施例,提供了用于以可被CPU340更有效地处理的格式表示关系型数据的技术。特别地,在一实施例中,关系型数据以字节可比较格式存储在每个列向量中。字节可比较格式是允许按字节地比较两个值的格式,其中两个值之间的第一不同字节准确地指示两个值中的哪一个大于另一个。
[0053]参考图5,图5是示出以字节可比较格式表示的两个值502和504之间的比较的框图。起初,比较两个值最左侧的字节(vlbl和v2bl)。如果该字节不相同,则比较操作结束,其第一字节比另一个大的值被确定为是较大值。例如,如果vlbl大于v2bl,则不论两个值的剩余字节如何,字节可比较值502都大于字节可比较值504。
[0054]另一方面,如果第一字节vlbl和v2bl相同,则对下两个字节vlb2和v2b2进行比较。类似于第一字节的比较,如果第二字节不相同,则该字节比较的结果确定两个值502和504的比较的结果。
[0055]如果第二字节vlb2和v2b2相同,则对第三字节vlb3和v2b3进行比较。比较操作以此方式继续,直到(a)遇到不同字节或(b)值之一或二者的字节消耗完。在一个字节可比较值的字节消耗完的情况下,字节没有消耗完的字节可比较值被确定为比字节消耗完的字节可比较值更大。例如,如果vlbl、vlb2和vlb3与v2bl、v2b2和v2b3相同,贝U字节可比较值504被确定为大于字节可比较值502。
[0056]如果两个字节可比较值同时消耗完字节,并且所有比较字节相同,则字节可比较值被确定为相同。因此,如果字节可比较值504仅有3字节长,并且这3个字节与字节可比较值502的3个字节相同,则字节可比较值502和504被认为是相同的。
[0057]虽然图5所示的按字节比较被描述为顺序操作,但是也可以并行地执行按字节比较。例如,字节可比较值502的每个字节可同时与字节可比较值504的对应字节相比较。在执行比较之后,不匹配的最左侧比较确定两个字节可比较值之间的比较结果。例如,字节vlbl、vlb2和vlb3可分别与字节v2bl、v2b2和v2b3同时比较。在这种情况下,如果结果是vlbl = v2bl, vlb2>v2b2且vlb3〈v2b3,则vlb2>v2b2比较确定结果,并且字节可比较值502被确定为大于字节可比较值504。
[0058]字节可比较格式不限于任何特定数据类型。例如,整数、日期、二进制大对象(BLOB)、字符大对象(CLOB)、浮点数和字符串都可按字节可比较格式存储。虽然整数的按字节比较指示哪个整数在数值上更大,但是其他类型的值的按字节比较指示不同类型的关系。例如,字节可比较格式的日期的按字节比较指示哪个日期在时间上晚于另一个。类似地,字节可比较格式的字符串的按字节比较指示哪个字符串按字母顺序在另一个之后。
[0059]以字节可比较格式表示各种数据类型的值的具体方式可以因实施方式而异,此处描述的技术不必局限于任何特定的实施方式。本发明一实施例中可用于以列向量表不值的格式的详细描述位于WWW.0rafaq.com/wiki/Data_type,其整体内容合并于此。在该处描述的格式中,日期以例如7字节结构表示,其中7个字节分别是:国家+100、世纪年+100、月、日、小时+1、分钟+1和秒+1。
[0060]如图5所示,字节可比较值无需具有相同数目的待比较字节。然而,如下面将描述的那样,可能有希望迫使字节可比较值为特定尺寸的情况。在这些情况下,为了增大字节可比较值的尺寸所需的任何填充字节被添加到已有字节的右侧。例如,为了将字节可比较值502的尺寸增加到5字节,将在字节vlb3后面增加2个填充字节。
[0061]在右侧填充O不改变不允许拖O的数据类型的字节比较结果,因为即使长度变为相同,O总是最小的数字。在www.0rafaq.com/wiki/Data_type处描述的数字(NUMBER)和日期(DATE)格式是其值不允许拖O的格式的例子。因此,这些格式是保持比较且无损字节填充格式的例子。
[0062]将其他数据类型视为二进制数
[0063]如上所述,字节可比较格式可用于将二进制数之外的数据类型表示为一系列字节。当以字节可比较格式表示不是二进制数的数据类型时,通过将字节可比较值视为二进制数,CPU可以使用算术逻辑器对该数据类型的值进行比较。例如,假设CPU340具有用于执行8字节二进制数之间的算术比较的逻辑器。该同一逻辑器可用于执行以字节可比较格式表示的两个串之间的串对串比较。特别地,如果需要,比较操作所涉及的两个串的字节将被填充以形成两个8字节值。这些8字节值将被如同该值是8字节二进制值那样加载到CPU340内的适当的寄存器中,CPU340将运行指令以执行二进制数比较。然后该比较的结果被用作由所述值表示的两个串的比较的结果。
[0064]芯片上向量处理操作
[0065]代替以字节可比较格式存储关系型数据或者附加地,可以通过增加CPU340内的并行度来提高CPU340处理数据库操作所涉及的值的速率。在一实施例中,CPU340采用SIMD(单指令多数据)体系架构,其允许同时对多个数据值执行相同操作。例如,在执行“select cl from emp where c2>30”期间,CPU340可同时将值“30”与多个行的c2的值进行比较。
[0066]虽然此处描述了使用SMD指令来增加对列值执行操作的速率的实施例,但是在替代实施例中,通过使用非SIMD指令对填充数据执行密集迭代,可以提高性能而不使用SMD指令。因此,此处描述的技术不限于使用SMD指令。
[0067]图6是根据采用芯片上向量处理的实施例,更详细地示出CPU340的框图。在图6所示的实施例中,CPU340内的寄存器346包括用于存储操作中涉及的值的储存器。寄存器346可以是例如256比特寄存器。出于SMD操作的目的,寄存器346可被视为存储位置604、606、608和610的阵列,每个存储位置保持固定宽度的数据元素。寄存器346内可以同时存储的固定宽度数据元素的数目基于数据元素的尺寸和寄存器346的大小而改变。例如,如果寄存器346是256比特寄存器,则寄存器346可以同时存储4个8字节宽的固定宽度数据元素,或者8个4字节宽的固定宽度数据元素。此处描述的技术不限于任意特定的寄存器大小,也不限于数据元素的任意特定的固定宽度尺寸。
[0068]列向量的值被加载到存储位置604-610中的每一个中,并且同时对所有值执行相同操作(在来自指令池620的指令中指定)。例如,在单个步骤期间(根据CPU的实施方式,其可以占据一个或多个时钟周期),每个存储位置604-610中的值可以与特定值比较。
[0069]来自列向量的一系列连续值在此处被称为列向量的“片段”。作为向量处理操作的目标的片段在此处被称为“目标片段”。在向量处理操作期间,在CPU中并行地处理目标片段内的所有值。CPU能够并行处理的值的数目可以根据各种因素而改变,诸如可用寄存器的数目、列向量是否被压缩或编码、以及CPU是否配置为处理可变长度值。
[0070]如上所述,为了评估谓词(predicate) “c2>30”,CPU340必须将列c2中的所有值与数字30比较。采用芯片上向量处理的实施例可以如下执行谓词评估:
[0071 ].将列向量404的值拷贝到CPU340中;以及
[0072].在每个向量处理操作期间,将列向量404的多个值与数字30进行比较。
[0073]例如,在评估谓词“c2>30”所执行的第一个向量处理操作期间,值rlc2、r2c2、r3c2和r4c2可分别加载到存储位置604、606、608和610中,并且与30比较。在评估谓词“c2>30”所执行的第二个向量处理操作期间,值r5c2、r6c2、r7c2和r8c2可分别加载到存储位置604、606、608和610,并且与30比较。因此,使用向量处理操作,可以在两个向量处理操作中评估谓词“c2>30”,每个向量处理操作占用单个步骤(根据硬件,其可以等同于CPU340的单个时钟周期)。
[0074]固定长度存储器内表示
[0075]常规SMD体系架构对固定宽度的数据元素执行SMD操作。对于SMD操作针对的各个数据元素,CPU期望的固定宽度尺寸在此处被称为“期望尺寸”。为了便于具有特定期望尺寸的CPU内的SMD操作,实施例可以在易失性存储器330内以与期望尺寸对应的固定尺寸表示存储关系型数据。例如,如果CPU340配置为对6字节宽的值执行SMD操作,则使用6字节来存储每个列向量402、404、406、408和410中的每个值。
[0076]在CPU340需要固定尺寸的值以便执行SMD操作的实施例中,以与期望尺寸匹配的固定尺寸格式存储关系型数据避免了当数据在易失性存储器330和用于执行向量处理操作的寄存器346之间移动时需要对关系型数据进行重新格式化。
[0077]然而,不是所有关系型值都需要相同量的存储器。因此,在一实施例中,在将关系型值存储在易失性存储器330内之前对关系型值应用填充。给关系型值添加的填充的量基于关系型值的本征尺寸和CPU340使用的期望尺寸之间的差。例如,如果CPU340设计为对6字节宽的值执行SMD操作,则已经为6字节的关系型值将根本不被填充,但是I字节的关系型值将被填充5个字节。
[0078]不幸的是,填充保持在易失性存储器330内的列向量中的值要消耗比表示这些值所需的更多的易失性存储器330。另外,由于填充了的值比未填充的值大,所以在任意给定时钟周期内可以在I/O路径350上传输更少的填充值。因此,在下面更详细地描述的替代实施例中,在值已经被传输到CPU340之后执行填充,或根本不执行。
[0079]列向量组块(chunk)
[0080]在上面给出的例子中,假设CPU支持对特定固定尺寸的值的SMD操作,并且使用填充来确保每个列向量内的所有值以该特定固定尺寸存储在易失性存储器内。然而,某些CPU可以支持多个期望尺寸。例如,CPU可以能够对256比特寄存器内的4个8字节值或者256比特寄存器内的8个4字节值执行SMD操作。在这种系统中,不同数据项可被填充到不同的固定长度尺寸。
[0081]在一实施例中,列向量被分解为“组块”,组块内的所有值被填充到相同的固定宽度,但是该固定宽度可以因组块而异。例如,一个组块内的所有值可由4个字节表示,而下一个组块内的所有值可由8字节表示。
[0082]根据一实施例,当支持多个期望尺寸时,用于表示任何给定组块内的值的固定尺寸被选择为可表示该组块内的所有值的最小期望尺寸。例如,对于其中所有值可由4字节表示的组块,如果需要,所有值将被填充到4字节宽。另一方面,对于至少一个值需要超过4字节的组块,如果需要,所有值都将被填充到8字节宽。
[0083]当一个组块的值被加载到寄存器中以用于SMD操作时,CPU基于该组块被填充到的期望尺寸,确定将该组块视为一系列4字节值还是一系列8字节值。列向量的组块之间的边界以及每个组块内的值被填充到的期望尺寸可被保持为列向量自身内的元数据,或者可与列向量分开保持。
[0084]异常标记
[0085]可能有较小百分比的列值非常大的情况。对所有值进行填充以获得甚至适应这些非常大的值的固定尺寸可能造成浪费。例如,如果列包含可装入一个字节的一千个值以及需要8个字节的一个值,对一千个值进行填充从而每个值消耗8字节将是浪费的。使用列向量组块,仅对于与非常大的值落在相同组块内的值造成存储器的浪费。
[0086]代替使用上述列向量组块或者附加地,通过从列向量中去除所有异常大的值,可以进一步减少浪费的存储器的量。这些异常大的值可存储在别处,并且可在列向量内用“标记”值代替。标记值指示实际值太大以致于被另外存储。如果需要,标记值以及列向量内的其他值可被填充以实现相对小的固定尺寸。
[0087]当在CPU内处理列向量的值时,CPU检测何时出现标记值,并且执行附加步骤以检索和处理与标记值对应的实际值。因此,以单独检索和处理异常大值所需的开销为代价,可以显著减少填充了的固定尺寸值的列向量的总体存储器消耗。
[0088]可变长度存储器内表示
[0089]虽然在易失性存储器330内存储通过填充以匹配期望尺寸的关系型值便于向量处理操作的执行,但是这也消耗了更多存储器,并且减小了 CPU340能够抓取有用数据的速度。因此,提供了以可变长度格式在易失性存储器330内存储列向量中的值的实施例。可变长度格式可涉及可变字节宽度和/或可变比特宽度。下面将更具体地描述各种可变长度格式。
[0090]在存储可变长度格式的值的实施例中,每个列向量内的各个值的长度可在列向量内随数据散置存储,或存储在与列向量本身分开保持的“长度向量”内。图6示出了一实施例,其中单独的长度向量618与列向量404相关联地保持。长度向量618包括可从其导出列向量404内的各个值之间的边界的信息。
[0091]在使用单独的长度向量的实施例中,长度向量自身可利用行程编码和比特打包(packing)而进一步压缩。这种类型的紧凑存储避免了如果在易失性存储器330中以足够宽以适应最宽列值的固定长度格式填充和储存可变长度列值则将会发生的易失性存储器330的浪费。
[0092]在存储器内的列向量内,可变长度格式可以是压缩或未压缩的。使用未压缩的可变长度格式可以允许将值传递到CPU并且对其进行操作而无需额外的解压缩开销。另一方面,压缩的可变长度格式允许以更快的速率将值传递给CPU。另外,根据压缩格式和所涉及的操作类型,因为对压缩的可变长度值执行操作仍将产生正确结果,所以可以避免与解压缩相关联的开销。
[0093]在采用包含可变长度列值的列向量的实施例中,运行查询以使得列向量从易失性存储器330作为字节流(或两个流,一个流用于可变长度值流,第二个流用于长度)而非固定长度值的向量进入CPU340。例如,如图8所示,假设列向量404的值(rlc2、r2c2、r3c2、r4c2、r5c2、r6c2、r7c2、r8c2)分别是 10、7、FFF、8A、3、F100、45、4 (十六进制)。基于这些值,长度向量618将是2、1、3、2、1、4、2、1。特别地,如图8所示,长度向量618内的第一个值(即,“2”)表示列向量404内的第一个值(即,“10”)的2字节长度,第二个长度向量值(即,“I”)指示列向量404内的第二个值(即,“7”)的I字节长度,等等。
[0094]可变宽度字典编码
[0095]此处描述的技术不限于特定可变宽度格式。然而,出于解释的目的,下面描述一种例如当列内的所有值为4字节或更小时,可应用于列的编码技术。该技术产生对每组4个值的长度的组合进行编码的向量以及实际值本身的打包向量。为了进行谓词评估,值被动态地解包到CPU内的寄存器中。相同的基本方案可应用于比特对齐或字节对齐的可变宽度字典格式。
[0096]特别地,考虑偏斜(skewed)字典仅具有两个可能码长度η和m的情况。最常见的值被分配给η比特宽的码,不太常见的值被分配给m比特的码。在这个例子中,可以说字典具有两个级别,其中第一级别包含常见值和η比特码之间的映射,第二级别包含不太常见的值和m比特码之间的映射。
[0097]在采用两个长度η和m的码的字典中,可能存在两个长度的任意组合,诸如η = 6和m= 11。然而,为了说明,将假设η = 6且m= 11。使码长度字节对齐可使事情得到简化,因此有较不复杂的移位和掩码。
[0098]为了以较少字节表示大量的值,值的向量包含来自字典的码,而不是这些码实际表示的值。因此,在本例子中,值的向量将包括一系列8比特和16比特的字典码。例如,假设值X被映射到码nl (η比特码),值Y被映射到码η2 (η比特码),值Z被映射到码ml (m比特码)。如果列中的值是X、X、Z、Y,则该列的值的向量将包含nl、nl、ml、n2。
[0099]在这种情况下,对于值向量中的每8个值,对长度进行编码的向量可以具有I个字节。该I个字节将对256个可能的长度组合中的以值向量内对应的8个值表示的长度组合进行编码。例如,该字节内的每个比特可以对应于8个值中的相应的一个,如果对应的值是η比特码,则该比特是“1”,如果对应的值是m比特码,则该比特是“O”。结果,8个值nl、nl、ml、n2、n2、m2、n3的长度向量内的字节将是“ 11011001”。
[0100]根据一实施例,字典所使用的码被这样分配,在该字典的每个级别内,码与它们对应的值具有相同的关系。即,对于任意两个η宽度码,如果nl>n2,则映射到nl的值大于映射到n2的值。类似地,对于任意两个m宽度码,如果ml>m2,则映射到ml的值大于映射到m2的值。
[0101]为了在该字典上运行简单的(不)等式谓词(例如,Cl>x),常数值X首先转换为该字典的两个级别中的每个级别的对应阈值。出于解释的目的,将假设X转变为该字典的η比特宽度级别中的η7,并且转变为该字典的m比特宽度级别中的m9。在对常数进行转换之后,读取编码的长度向量内的第一个值。类似于针对固定宽度字典所做的那样,该值被用于查找正确的混洗(shuffle)和掩码,以将前8个值放入到16字节寄存器中。基于编码的长度,两个常数阈值必须被适当地混洗,从而一字节阈值与一字节码对齐,并且两字节阈值与两字节码对齐。
[0102]例如,假设编码长度向量内的第一个值是“11011001”。基于该值,确定值向量内的前8个值将分别与阈值n7、n7、m9、n7、n7、m9、m9和n7进行比较。在已经执行该转换之后,在值和对应阈值之间执行SMD比较。然后执行移位,并且针对接下来的8个值重复该过程。
[0103]虽然这种编码技术类似于哈夫曼式编码,但是它不是无前缀的。编码不必是无前缀(prefix-free)的,因为长度被编码在单独的向量中。因此,该编码可被认为是具有(n+1)比特和(m+1)比特的无前缀码,但是每个码的第一比特存储在单独的向量内。
[0104]在一实施例中,这种编码技术被扩展到多于两个可能长度。采用三个可能长度,最有用的组合通常是1、2和4字节。在这些情况下,可以一次编码和处理4个值的长度。对于四个可能长度,1-4字节的任意组合可被编码。将使用两个比特编码每个长度。
[0105]本节中描述的编码技术可与其他编码和/或压缩技术组合,诸如行程编码(“run-length encoding, RLE”)。当与RLE组合时,当计算每个值的频率以确定哪个值被分配给哪个长度时,仅对每行程执行一次递增,而不是对每个值执行一次。
[0106]芯片内填充
[0107]不幸的是,CPU可能不能直接对可变长度值执行向量处理操作。因此,在仅支持对固定长度值执行向量处理操作的系统中,附加的处理必须在CPU上发生以使得能够有效地对各个元素直接执行算术操作(例如,比较、加法等)。
[0108]根据一实施例,在值通过I/O路径350传输到CPU340之后,执行使得各个值符合CPU340使用的向量处理寄存器的大小所需的任何填充。特别地,在一实施例中,CPU340设计为在两阶段处理中顺序地处理值流的各部分。在第一阶段,CPU340上的转换逻辑器630将一系列可变长度值转换为可置于寄存器346中以用于向量处理的形式。在第二阶段,对寄存器346内的值并行执行适当的向量处理操作。这两个阶段在不同的周期执行,或一起执行。
[0109]例如,假设列向量404的值流107FFF8A3F100454从易失性存储器330馈送到CPU340中以用于向量处理操作。进一步假设存储位置604-610设计为对固定长度的4字节值进行操作。基于也通过I/O路径350提供给CPU340的长度向量618中指出的尺寸,CPU340认识到值流内的值的长度是2、1、3、2、1、4、2、I。
[0110]基于长度向量618内包含的长度信息,转换逻辑器630在向量处理操作的第一阶段期间执行以下步骤:
[0111].确定值流的前2个字节用于rlc2,并且给rlc2添加2个附加的填充字节,以产生 1000
[0112].确定值流的下一个字节用于r2c2,并且给r2c2添加3个附加的填充字节,以产生 7000
[0113].确定值流的下3个字节用于r3c2,并且给r3c2添加I个附加的填充字节,以产生 FFi7O
[0114].确定值流的下2个字节用于r4c2,并且给r4c2添加2个附加的填充字节,以产生 8A00
[0115].确定值流的下一个字节用于r5c2,并且给r5c2添加3个附加的填充字节,以产生 3000
[0116]在图6所示的实施例中,仅4个存储位置604-610可用于执行向量处理操作。因此,列向量404的值流内的值的其余部分(即,r5c2、r6c2、r7c2和r8c2)在第一阶段的后续迭代中被填充。
[0117]一旦值已被填充并且放置到适当的存储位置604-610,就执行向量处理操作的第二阶段。在向量处理操作的第二阶段中,CPU340发出来自指令池620的第二指令,以便对存储位置604-610内的值并行地执行算术操作。该算术操作可以是,例如,那些值中的每一个与值“30”的字节可比较版本之间的比较。
[0118]在不涉及向量处理操作的情况下芯片上填充也是有用的。例如,可变宽度数据可被读入并且在芯片上填充,但是每次仅处理一个元素(即,不是SMD)。例如,当数据元素的宽度太大,以致于多个数据元素不能装入单个寄存器时,可能需要每次处理一个元素。即使在这些情况下,芯片上填充也是有用的,这是因为可变宽度存储节省了易失性存储器内的空间,并且芯片上填充导致的固定宽度的元素使得能够以每个比较最小的处理开销对值流执行本地二进制ALU比较。
[0119]对可变长度数据的向量处理操作
[0120]在上面描述的实施例中,列值以可变长度形式传递到CPU,并且每个向量处理操作的第一阶段涉及填充列值以产生固定长度值的向量。虽然将列值以可变长度格式从易失性存储器330传输到CPU340允许通过I/O路径35的固定带宽以较快的速率向CPU340馈送列值,但是与在CPU340内将可变长度值转换为固定长度值相关联的开销减小了 CPU340可以处理这些列值的速率。另外,在执行向量处理操作之前增加值的尺寸(通过增加填充)减少了在向量处理操作的任何给定迭代期间能够装入寄存器346内的值的数目。
[0121]因此,在一替换实施例中,通过将CPU340设计为利用包含在长度向量618内的信息直接对未对齐的比特流执行向量操作,避免了需要在CPU340上执行可变长度到固定长度的值转换。图7是一实施例的框图,其中CPU340配置为对可变长度值直接执行向量处理操作。
[0122]参考图7,在CPU340的控制器342内,转换逻辑器630被尺寸指示器逻辑器710取代。尺寸指示器逻辑器710大体上表示向CPU340内的向量处理元件指示当前存储在寄存器346内的值(“目标值”)的相应长度的逻辑器。此外,从图7中去除了图6所示的固定长度存储位置604-610。不是在各个目标值之间具有任何固定的边界,基于目标值的长度,目标值之间的边界根据操作而改变。因此,寄存器346可实现为表示多个虚拟寄存器的单个物理寄存器,其中由当前目标值的长度规定物理寄存器内的虚拟寄存器的大小。
[0123]I/O路径350的一部分用于将长度向量618的一部分馈送到芯片上高速缓存602内的长度高速缓存712中,并且将列向量404的一部分馈送到芯片上高速缓存602内的值高速缓存714中。值高速缓存714的内容作为向量处理操作的目标值被馈送到寄存器346中,而尺寸指示器逻辑器710使用长度高速缓存712的内容来确定向量处理操作中所涉及的目标值的长度。由尺寸指示器逻辑器710传递到ALU344的那些长度使得CPU340内的向量处理元件能够对寄存器346内的各个目标值进行操作。
[0124]根据一实施例,不仅虚拟寄存器的大小根据操作而改变,而且虚拟寄存器的数目也根据操作而改变。特别地,因为目标值的长度改变,所以在任何给定的向量处理操作期间装入寄存器346内的目标值的数目也可以改变。
[0125]例如,假设寄存器346保持值流的8个字节。进一步假设rlc2和r2c2是3字节值,r3c2和r4c2是2字节值,并且r5c2、r6c2、r7c2和r8c2是I字节值。在这种情况下,在向量处理操作的第一个迭代期间,寄存器346将仅保持3个值(例如,rlc2、r2c2和r3c2),而在向量处理操作的第二个迭代期间,寄存器346将保持5个值(r4c2、r5c2、r6c2、r7c2、r8c2)。在这个实施例中,目标值的尺寸不仅规定多快地从易失性存储器330向CPU340馈送值,而且规定在向量处理操作期间实现的并行度。
[0126]列向量值的压缩和编码
[0127]表示列向量值所需的存储器越少,可以越快地在I/O路径350上向CPU340馈送列向量值。如上所述,减少用于表示列向量值的存储器的量的一种方式是以可变长度格式存储这些值。在替换实施例中,代替以可变长度格式表示值或者除此之外附加地,可以对列向量值使用其它的值尺寸减小技术。
[0128]例如,根据一实施例,使用“行程向量”来指示值的连续重复的数目。例如,一系列值33、33、33、3、4、8、8、9由向量333489、字节长度向量2、1、1、I和行程向量3、1、1、2、I表示。长度向量和行程向量可以紧凑形式表示为值、长度的对以节省空间。
[0129]作为另一个例子,可以使用许多数据压缩技术中的任何一种来压缩列向量404。列向量值在I/o路径350上以它们的压缩格式传输,并且根据需要在CPU340内解压缩,以产生向量处理操作所需形式的值。为了能够进行数据值的芯片上解压缩,可能需要从易失性存储器330向CPU340传递某些附加信息。例如,某些压缩技术涉及创建记号(token)到值的映射。当使用这种技术压缩列向量值时,记号到值映射在I/O路径350上传输到CPU340,以使得能够进行值的芯片上解压缩。
[0130]在一实施例中,记号值映射中使用的记号是到字典内的指针。在这种实施例中,字典在I/O路径350上传输到CPU340以使得能够进行值的芯片上解压缩。代替行程长度编码或除此之外附加地,可执行列向量值的记号化。特别地,可以独立地或组合地使用诸如行程编码或记号化之类的技术。组合地使用行程编码和记号化的一个例子可以涉及基于字典用码代替值,然后应用行程编码和如此产生的码。
[0131]在一实施例中,实现列向量值的芯片上解压缩所需的信息被固定在CPU340的芯片上高速缓存602内,至少在以该信息对应的值为目标的向量处理操作期间被固定在CPU340的芯片上高速缓存602内。
[0132]行程编码和字典编码仅是可以单独或组合使用以减少列向量消耗的存储器量的许多类型的编码/压缩技术中的两种。此处描述的技术不局限于任何特定的编码/压缩技术。例如,替换实施例可以直接对列值或者对通过对列向量应用一个或多个轻压缩技术(例如,打包可变宽度编码、记号化、行程编码)产生的结果应用一个或多个重压缩技术(例如,LZ0、ZLIB)。
[0133]直接对压缩/编码数据进行向量处理
[0134]以压缩和/或编码格式在易失性存储器330和CPU340之间传输列向量值增加了可向CPU340馈送执行数据库操作所需的列值的速率。然而,在CPU340内对值进行解压缩和/或解码招致额外开销,其可能增加CPU340内的流水线和/或增加必须被执行以执行向量处理操作的指令的数目。因此,根据一实施例,通过使用产生可以对其直接执行向量处理操作的值的压缩/编码技术,实现I/o路径350上增加的吞吐量,而没有芯片上解压缩开销。例如,用c()表示用于压缩列向量值的压缩函数。如果保证c(X)>c(y)以产生与x>y相同的结果,则可以直接对压缩的列值执行向量处理操作。特别地,为了评估谓词c2>30,直接将c2的压缩值与压缩“30”产生的值进行比较。
[0135]可以使用各种技术保证值的压缩表示的比较产生与未压缩值的比较相同的结果。特定的技术可以基于使用的压缩技术而改变。例如,在以较小记号替换较长值的实施例中,可以选择用于替换较长值的记号,从而用于替换较低值的记号低于用于替换较高值的记号。在使用这样的技术的特定实施例中,可以用指向包含值的字典的指针替代值。在该字典内,值可被以一种方式排序,以确保到较低值的指针自身低于到较高值的指针。
[0136]作为另一个例子,假设使用行程编码来减小列向量404的尺寸。可以直接对行程编码的列向量内的值执行向量处理操作。然而,行程编码的列向量内的每个值可以表示来自多个行的值。行程编码的列向量内的任意单个值表示的行数由行程向量指示。因此,当直接对行程编码的列向量内的值执行向量处理操作时,行程向量用于确定该结果所应用到的行数。
[0137]例如,如果列c2具有用于4个连续行的值“3”,列向量404将包含用于4个行的单个值“3”,并且行程向量将指示“4”,意味着4个连续行具有值“3”。在向量处理操作期间,列向量404中的值“3”的单个实例被与“30”比较。谓词3>30的值被确定为“假(false) ”。然而,不是将结果“假”应用于单个行,由行程向量内的对应值规定应用“假”的行的数目。在当前的例子中,通过评估3>30产生的“假”将应用于4个行。
[0138]当不能保证对压缩数据执行的操作与对未压缩数据执行的操作产生相同的结果时,在评估引用数据的谓词之前,可能必须对压缩/编码数据执行解压缩/解码。例如,如果使用zlib压缩,可能需要在CPU中在飞行中对压缩数据进行解压缩。一旦被解压缩,如上面所述,可以给向量处理提供解压缩的输出。
[0139]压缩解码数据
[0140]除了列值自身之外,上面描述的用于增加可将列值从易失性存储器330传输到CPU340的速率的各种技术中的许多技术需要从易失性存储器330向CPU340传送信息。CPU340对列向量进行解压缩、解释和/或解码所需的信息在此处被泛称为“解码数据”。基于用于产生编码/压缩的列向量的编码和/或压缩技术,CPU340所需的解码数据的类型可以根据实现而改变。
[0141]例如,当列值被以可变长度格式传输到CPU340时,解码数据可以包括长度向量618。特别地,将长度向量618提供给CPU340,以使得CPU340能够确定每个单独的列值在列向量404中开始和结束的位置。
[0142]作为另一个例子,当列值被以行程编码格式传输到CPU340时,解码数据可以包括行程向量。特别地,将行程向量提供给CPU340,以使得CPU340能够确定列向量404中的每个值对应于多少行。
[0143]作为另一个例子,当列向量404被压缩时,解码数据可以包括CPU340需要的某些信息(诸如记号到值映射),以使得CPU340能够执行各个列向量值的芯片上解压缩。
[0144]不幸的是,向CPU340传递解码数据消耗了 I/O路径350的可用于传输列值的带宽。因此,解码数据的尺寸越小,I/o路径350的可用于传输列值的量越大。因此,根据一实施例,解码数据本身被编码和/或压缩。用于减少解码信息的尺寸的编码和/或压缩可以与用于减小列向量的尺寸的编码和/或压缩相同或不同。
[0145]例如,假设列向量404具有行程编码的可变长度值。在这种情况下,用于列向量404的解码信息包括长度向量和行程向量。为了减小解码信尺寸大小,长度向量和行程向量两者可按行程编码的格式存储。在这种情况下,解码信息可以包括附加行程向量,其被CPU340用于解码长度向量和原始的行程向量,长度向量和原始的行程向量又被用于解码列向量404。
[0146]向量处理操作的例子
[0147]在上面给出的例子中,向量处理操作涉及比较一个列向量的值与一个常数。然而,向量处理操作和此处描述的技术不受此限制。而是,向量处理操作可以涉及对多个列向量的操作。
[0148]例如,向量处理操作可用于评估涉及列到列比较的查询谓词。列可以来自相同表格(例如Tl.1ncome>Tl.expenses)或者来自不同的表格(Tl.age>T2.age)。在这种情况下,两个列的列向量中的片段被加载到CPU中,并且在向量处理操作期间被并行处理。
[0149]此外,向量处理操作可以不仅仅涉及简单的值对值比较。例如,向量处理操作可以涉及集合成员操作和聚集。
[0150]另外,当使用压缩格式时,压缩格式本身可以由多个向量构成,每个向量可以被分别处理,并且然后结果被组合。例如,除RLE向量之外,可以使用单独的比特向量指示列中的哪些值为空(NULL)。在这种情况下,可以在处理值向量之后处理行程。
[0151]软件实现
[0152]此处描述的一些实施例涉及CPU上用于诸如填充、解压缩和向量处理操作之类的芯片上操作的特殊硬件组件,然而,在CPU不包括这种硬件组件的情况下,仍然可以使用软件指令来实现这里描述的技术,当由CPU执行时,这些软件指令执行否则将由CPU所不具有的特殊硬件组件执行的工作。
[0153]例如,在缺少用于芯片上填充和/或解压缩的专用硬件的情况下,可以通过使CPU执行对经由I/o路径350从易失性存储器获得的列向量格式的值进行填充和/或解压缩的指令,来执行芯片上填充和/或解压缩。该指令可以使这样获得的值被在芯片上串行或者并行地填充和/或解压缩。在响应于软件指令的执行而在芯片上进行填充和/或解压缩之后,对所得值执行向量处理操作,而不必首先将值传输回到动态存储器。这样,即使当在没有专用硬件的情况下在芯片上执行解压缩和/或填充时,值仅需要在I/o路径350上传输到CPU一次。另外,在该一次传输期间,值为可变宽度和/或压缩格式,从而有效地使用I/O路径350上可获得的有限带宽。
[0154]此处描述的技术甚至可以在不具有用于向量处理操作的硬件支持的CPU上实现。在缺少向量处理寄存器的情况下,CPU可以简单地执行指令,以便串行地执行否则将使用向量处理寄存器并行进行的操作。例如,当查询的谓词是“where c2>30”时,响应于在CPU上执行指令,列向量c2的值可被迭代地与30比较。虽然采用否则将使用专用硬件并行执行的操作的串行执行通常效率较低,但是通过最大化I/O路径350的使用,仍然可以改善整个查询执行。
[0155]当设计为用于特定硬件环境时,专用硬件的仿真程序可被硬编码,以便利用存在于该硬件环境内的特定硬件。另外,当被设计为独立于硬件使用时,仿真软件可被设计为首先检测执行仿真软件的环境中存在什么硬件,然后当仿真向量处理、填充和/或解压缩硬件时,使用检测到的硬件能力。
[0156]软件实现的例子:芯片上解压缩
[0157]如上所述,在缺少用于产生在谓词中调用的特定操作的结果向量的专用硬件的情况下,可以使用编程以使得CPU执行否则将由专用硬件执行的操作。例如,假设谓词中指定的操作是“coll〈7”,要求对列coll中的全部值与常量值“7”进行比较。
[0158]执行对coll的值和“7”进行比较的操作产生输出比特向量,其中输出比特向量中的每个比特指示coll中的对应值是否小于“7”。例如,假设coll中的值是“5、9、8、6、
3、...”。基于这些值,比较产生的输出比特向量将是“10011…”。
[0159]出于本示例的目的,假设处理器不具有用于执行RLE压缩列向量的芯片上解压缩的专用硬件。进一步假设列值具有固定数据宽度8。
[0160]在这种情况下,可以通过调用以软件实现的less-than函数(comp_lt)产生less-than操作的结果向量。例如,请求less-than操作的应用(“调用方”)可以通过执行以下步骤来使用less-than函数。
[0161]1.定义具有分配的比特向量的结果列向量(res)。如此分配的比特向量被完全展开(即,不是RLE编码数据流的尺寸,而是列向量中的行数的尺寸)。 [0162]2.定义具有编码类型(固定(FIXED) RLE)的源列向量(src)。
[0163]3.定义具有编码类型(固定)的常数源列向量(常数)。
[0164]4.调用 less-than 比较函数 comp_lt (res, src, constant, NULL)。
[0165]如下面更详细描述的那样,比较函数comp_lt的NULL操作数是指示具有NULL值的行位置的向量。根据一实施例,以软件实现的less-than函数(comp_lt)执行图10所示的步骤,以产生less-than操作的结果向量。参考图10,在步骤1002,CPU将常数源操作数(例如“7”)加载到某个SIMD寄存器X的N个分区中的每一个中。
[0166]在步骤1004,CPU执行芯片上RLE解压缩,以便从压缩的输入向量获得N个固定宽度的列值。可以通过例如执行下面详细描述的函数RLEdecO来执行芯片上RLE解压缩。
[0167]在步骤1006,CPU将N个解压缩的列值加载到某个SIMD寄存器Y。在当前的例子中,列值在被输入SMD寄存器Y之前不必被填充,因为该值已经是固定宽度的。假如列具有值“5、9、8、6、3、…”。在步骤1006期间,值“5”被加载到SMD寄存器Y的第一分区,值“9”被加载到SIMD寄存器Y的第二分区,等等。
[0168]在步骤1008,CPU执行SMD指令,以便比较X和Y,并且将结果存储在SMD寄存器Z内。在执行该比较之后,寄存器Z的第一分区具有通过寄存器X的第一分区中的“7”和寄存器Y的第一分区中的“5”之间的比较产生的值。类似地,寄存器Z的第二分区具有通过寄存器X的第二分区中的“7”和寄存器Y的第二分区中的“9”之间的比较产生的值。
[0169]因为用于执行SMD比较的分区是8比特宽的,所以产生的结果值可以是8比特宽的,仅用这些比特中的一个反映对应的比较的结果。例如,寄存器X的第一分区中的“7”和寄存器Y的第一分区中的“5”的比较可以产生寄存器Z中的一个1XXXXXXX形式的8比特值,其中第一比特位置的“I”指示“5”小于“7”,其它7个比特位置全为零或无意义数据。在这种情况下,需要放入结果比特向量的比特值在寄存器Z内被7个无意义比特间隔开。
[0170]这样,在一实施例中为了产生结果比特向量,在步骤1010,给寄存器Z的内容应用掩码,以适当地设置结果向量的输出比特。
[0171]在步骤1012,判断是否列向量中的所有值都已经被处理。这样,如果N是8,并且列向量具有24个值,则控制将从步骤1012回到步骤1004两次,从而输入列向量中的全部24个值都被处理。
[0172]在步骤1014,当输入向量中的所有值都已经被处理时,结果比特被存储在输出向量(res)内。 [0173]在某些情况下,输入向量可包含空(NULL)值。在这样的情况下,涉及空值比较的SMD操作所产生的结果比特可以是“I”。然而,空值与任意其它值的比较应为假(false)(例如“O”)。因此,根据一实施例,创建空向量,其在与输入列中的非空值对应的每个位置处包括“1”,并且在与输入列向量中的空值对应的每个位置处为“O”。通过执行结果向量和空比特向量之间的和(AND)操作,这个空向量可用于“修改”结果向量,有效地迫使结果比特向量中与输入列向量中的空值对应的任意比特为“O”。
[0174]芯片上RLE解压缩
[0175]在上面给出的例子中,步骤1004涉及可通过调用函数RLEdecO执行的芯片上RLE解压缩。根据一实施例,RLEdecO函数假设列向量用RLE压缩,并且具有8比特的固定数据宽度。在这个例子中,列向量具有可被忽视的长度向量(长度宽度),因为数据元素具有固定长度。RLEdecO函数产生的结果列向量是该列向量的解压缩值。
[0176]RLE编码的列向量典型地具有一个数字,其后跟着一个列值。该数字指示该列值应在输出向量中重复多少次。例如,假设一个列保持值“B”和“W”,并且该列的未压缩内容是:B、B、B、W、W、B、B、B、B、B、W、W、B。在这种情况下,压缩的列向量是3B2W5B2W1B。在这个压缩的列向量中,第一个值“3”是行程值,其指示第二个值B在未压缩的列向量中重复3次,第三个值“2”是行程值,其指示第四个值“W”在未压缩的列向量中重复2次,等等。
[0177]根据一实施例,RLEdecO函数如下操作。
[0178]1.将RLE压缩的列向量中的第一个行程值加载到某个SIMD寄存器A。
[0179]2.将第一列值(如果需要,进行填充)加载到某个SIMD寄存器B。
[0180]3.将寄存器B内的列值重复地拷贝到某个寄存器C,其中进行的拷贝的数目由寄存器A中的行程值规定。
[0181]4.针对压缩的列向量内的下一个行程值/列值组合重复1-3。
[0182]5.重复4直到全部列值已被处理。
[0183]6.基于寄存器C的内容产生最终输出(未压缩的列向量)。
[0184]根据寄存器C的大小,在解压缩处理期间,寄存器C的内容可能必须被一次或多次地冲刷到其它芯片上存储器(例如,其它寄存器、芯片上高速缓存602等)。
[0185]当结合图10所示的过程使用时,步骤1004的每个迭代内仅需N个未压缩的列值。重复步骤1-3以获得N个未压缩的列值的次数将基于压缩的列向量内的行程而改变。例如,如果N是10,并且第一行程值是10或更大,则步骤1-3必须执行仅一次,以获得N个未压缩的列值。在另一方面,如果N大于第一行程编码值,将必须重复步骤1-3,直到所处理的行程编码值的和等于或者大于N。
[0186]软件实现的例子:无解压缩的比较
[0187]根据一实施例,SIMD操作可用于评估谓词,而不需要对谓词所涉及的列的列向量进行解压缩。例如,再一次假设谓词 中指定的操作是“coll〈7”,要求对列coll中的全部值与常量值“7”进行比较。进一步假设coll局限于4个可能的值“5、7、13和20”。因为coll局限于4个可能的值,所以这些值中的每一个可由两比特宽的置换码唯一地表示。特别地,“5、7、13和20”可分别被替换为两比特码“00”、“01”、“10”和“11”。重要地是,以保证如果值1>值2,则码(值1)>码(值2)的方式选择这些置换码。
[0188]基于上面描述的置换码映射,列coll中的值“5、7、13、20、13、…”可表示为“ 0001101110…”,其中前两个比特“ 00 ”指示第一个列值是“ 5 ”,第三和第四比特“01”指示
第二个列值是“7”,等等。
[0189]在这种情况下,对谓词“coll〈7”的评估可以如图11所示的那样进行。参考图11,在步骤1102,CPU将常数源操作数的码(例如,用于“7”的码)加载到某个SIMD寄存器X的N个分区中的每一个中。在当前的例子中,加载到寄存器X的N个分区中的每一个的码值是“01”。CPU可以作为less_than函数的输入参数或通过在编码coll的字典中查找常数源操作数的码,获得用于该常数源操作数的码。
[0190]在步骤1104,CPU读取压缩的输入向量中的N个码值。为了解释的目的,在当前的例子中,码值是固定宽度的。这样,步骤1104涉及从压缩的输入向量中读取NXFW个比特,其中FW是码的固定宽度。
[0191]在步骤1106,CPU将N个码值加载到某个SIMD寄存器Y。在当前的例子中,在加载到SMD寄存器Y之前码值不必被填充,因为码值已经是固定宽度的。假设压缩的列coll具有值“0001101110...”。在步骤1006期间,用于“5”的码“00”被加载至Ij SIMD寄存器Y的第一分区,并且用于“7”的码“01”被加载到SMD寄存器Y的第二分区,等等。
[0192]在步骤1108,CPU执行SMD指令,以便比较X和Y,并且将结果存储在SMD寄存器Z内。在执行这个比较之后,寄存器Z的第一分区具有由寄存器X的第一分区中的“7”的码“01”和寄存器Y的第一分区中的“5”的码“00”之间的比较所产生的值。类似地,寄存器Z的第二分区具有由寄存器X的第二分区中的“7”的码“01”和寄存器Y的第二分区中的“ 7 ”的码“ O I”之间的比较所产生的值。
[0193]在步骤1110,对寄存器Z的内容应用掩码,以便适当地设置结果向量的输出比特。[0194]在步骤1112,判断压缩的列向量中的所有值是否已经都被处理。这样,如果N是8,并且列向量具有24个值,则控制从步骤1112回到步骤1104两次,从而输入列向量中的全部24个值都被处理。
[0195]在步骤1114,当输入向量中的全部值都已经被处理时,结果比特被存储在输出向量(res)内。出于上面给出的原因,通过执行结果向量和空比特向量之间的和(AND)操作,可以使用空(NULL)向量“修改”结果向量,有效地迫使结果比特向量中的对应于输入列向量内的空值的任意比特为“O”。
[0196]软件实现的例子:芯片上填充
[0197]作为另一个例子,假设小于(less than)操作中涉及的列coll存储具有4字节最大数据宽度的可变宽度值。在这种情况下,列向量具有非空长度向量和长度宽度。出于说明的目的,假设coll中不存在空值,并且使用两比特编码该长度。例如,如果coll中的前4个值是“〈abXaXbXabcd〉”,则长度向量中的前4个值将是“〈01X00X00X11〉”,表明前4个值分别具有2字节、I字节、I字节和4字节。出于说明的目的,进一步假设列不具有任何拖尾的零。
[0198]根据一实施例,要求执行谓词评估的调用方执行以下步骤。
[0199]1.定义具有分配的比特向量的结果列向量(res)。
[0200]2.定义具有编码类型(DYN_PAD)的源列向量(src)。
[0201]3.定义具有编码类型(CONSTANT)的常数源列向量(constant_cv)。“num_of_rows”应为I,编码上下文中的“is_constant_value”标记应被设置。以相同宽度(即,在这个例子中,32比特)在数据流中存储该常数。
[0202]4.调用 comp_less_than (res, src, constant_cv, NULL)。
[0203]根据一实施例,专用函数comp_less_than执行图12所示的步骤,以便对该比较进行评估。参考图12,在步骤1202,CPU将常数源操作数(例如“7”)加载到某个SIMD寄存器X的N个分区中的每一个中。在步骤1204,初始化一指针以便从padded_encoded_lens的开头进行读取。
[0204]在步骤1206, CPU从padded_encoded_lens读取适当的(固定的)比特数。在当前的例子中,长度用两比特编码。因此,在步骤1206,读取padded_encoded_lens的前两个比特。
[0205]在步骤1208,从列向量src读取L字节,其中L是在步骤1206读取的长度值所指示的字节数目。例如,如果在步骤1206中读取的长度值是“01”,则在步骤1208中从列向量src读取2个字节。在另一方面,如果在步骤1206中读取的长度值是“ 11”,在步骤1208中从列向量src读取4个字节。
[0206]在步骤1210,填充从src读取的字节以便创建固定宽度的值。填充的数量基于读取的字节的数目和SIMD寄存器Y中的分区的大小。出于说明的目的,假设寄存器Y的分区是4字节宽的。这样,当从列向量src读取I个字节的值时,该值在步骤1210被填充3个字节。类似地,当从列向量src读取3个字节的值时,在被加载到寄存器Y的分区内之前,该值在步骤1210被填充I个字节。
[0207]步骤1212定义一循环,使得步骤1206、1208和1210重复,直到N个值已被动态地填充并且被加载到寄存器Y的分区中。[0208]在步骤1214,执行一 SMD指令,以便比较寄存器X中的值和寄存器Y中的值,并且将结果存储在SIMD寄存器Z中。
[0209]在步骤1216,对寄存器Z的内容应用掩码,以便适当地设置结果向量中的输出比特。
[0210]在步骤1218,判断是否压缩的列向量中的所有值都已经被处理。这样,如果N是8,并且列向量具有24个值,控制从步骤1218回到步骤1206两次,从而输入列向量中的全部24个值都已经被处理。
[0211]在步骤1220,当输入向量中的全部值都已经被处理时,结果比特被存储在输出向量(res)内。出于上面给出的原因,通过执行结果向量和空比特向量之间的和(AND)操作,可以使用空(NULL)向量“修改”结果向量,有效地迫使结果比特向量中的与输入列向量内的空值对应的任意比特为“O”。
[0212]修改和变体
[0213]此处描述的技术可被以各种方式实现。例如,列向量可以仅包括字节打包值或者仅包括比特打包值。作为另一个例子,可以在NUMA仿射(NUMA-affine)到存储数据的存储器的CPU上进行CPU处理。此外,在CPU硬件不支持将可变长度数据流解包为固定长度或字节对齐向量的实施例中,可以用多个指令实现解包操作。类似地,如果CPU不支持向量指令,则可以使用多个指令处理各个值。
[0214]硬件概述
[0215]根据一实施例,此处描述的技术用一个或多个专用计算设备实现。所述专用计算设备可被硬布线为执行该技术,或者可以包括被永久编程以便根据固件、存储器、其它存储设备或者其组合中的程序指令执行该技术的数字电子器件,诸如一个或多个专用集成电路(ASIC)或现场可编程门阵列(FPGA)。这种专用计算设备还可以组合定制的硬连线逻辑器、ASIC、或FPGA以及定制的程序以便完成该技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持设备、网络设备或者结合硬布线的和/或程序的逻辑器以便实现该技术的任意其它设备。
[0216]例如,图9是示出计算机系统900的框图,可以在计算机系统900上实现本发明的实施例。计算机系统900包括总线902或者用于传递信息的其它通信机构,以及与总线902耦连以便处理信息的硬件处理器904。硬件处理器904可以是例如通用微处理器。
[0217]计算机系统900还包括主存储器906,诸如随机存取存储器(RAM)或与总线902耦连以便存储信息和由处理器904执行的指令的其它动态存储设备。主存储器906还可用于在将由处理器904执行的指令的执行过程中存储临时变量或其它中间信息。当被存储在处理器904可以访问的非暂时性存储介质内时,这种指令使得计算机系统900成为被定制为执行所述指令中指定的操作的专用计算机。
[0218]计算机系统900还包括只读存储器(R0M)908或用于存储用于处理器904的静态信息与指令的耦连到总线902的其它静态存储设备。储存设备910,诸如磁盘或光盘,被提供并且耦连到总线902,以便存储信息与指令。
[0219]计算机系统900可以通过总线902耦连到显示器912,诸如阴极射线管(CRT),以便向计算机用户显示信息。包括字母数字以及其它按键的输入设备914耦连到总线902,用于向处理器904传递信息和命令选择。另一类型的用户输入设备是光标控制器916,诸如鼠标、轨迹球或光标方向按键,用于向处理器904传递方向信息和命令选择,以及用于控制光标在显示器912上的移动。这种输入设备典型地在两个轴上,即,第一轴(例如,X)和第二轴(例如,y),具有允许该设备指定平面内的位置的两个自由度。
[0220]出于说明的目的,计算机系统900被描述为若干不同的功能单元。然而,计算机系统900实际上可以被实现为芯片上系统。例如,存储控制器和网络接口可以是芯片级的,从而使得处理器904能够直接与主存储器和局域网对话,而不经过总线或另一接口。
[0221]计算机系统900可以使用定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑器实现此处描述的技术,所述定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑器与该计算机系统结合,使得程序计算机系统900成为专用机器。根据一实施例,响应于处理器904执行包含在主存储器906内的一个或多个指令的一个或多个系列,通过计算机系统900执行此处的技术。这种指令可被从另一存储介质,诸如存储设备910读入主存储器906。包含在主存储器906内的指令序列的执行使得处理器904执行此处描述的处理步骤。在替换实施例中,可以取代或结合软件指令使用硬布线的电路。
[0222]此处使用的术语“存储介质”指存储使得机器以特定方式操作的数据和/或指令的任意非暂时性介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括,例如,光学或磁盘,诸如储存设备910。易失性介质包括动态存储器,诸如主存储器906。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带或任意其它磁性数据存储介质、CD-ROM、任意其它光学数据存储介质、具有孔的图案的任意物理介质、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、任意其它存储器芯片或盒式磁带。
[0223]存储介质与传输介质不同,但是可以与传输介质结合使用。传输介质参与存储介质之间的信息传输。例如,传输介质包括同轴电缆、铜线和光纤,包括导线,所述导线包括总线902。传输介质还可以采取声波或光波的形式,诸如在无线电波和红外线数据通信过程中产生的波。
[0224]将一个或多个指令的一个或多个序列输送到处理器904以便执行可以涉及各种形式的介质。例如,指令最初可被携带在远程计算机的磁盘或固态驱动器上。该远程计算机可以将指令加载到其动态存储器,并且使用调制解调器在电话线路上发送该指令。计算机系统900本地的调制解调器可以在电话线上接收数据,并且使用红外线发射器将数据转换为红外线信号。红外线检测器可以接收红外线信号携带的数据,并且适当的电路可以将该数据放置在总线902上。总线902将数据运送到主存储器906,处理器904从主存储器906检索和执行指令。由主存储器906接收到的指令在以处理器904执行之前或之后可被可选择地存储在储存设备910上。
[0225]计算机系统900还包括耦连到总线902的通信接口 918。通信接口 918提供耦连到连接到局域网922的网络链路920的双向数据通信。例如,通信接口 918可以是综合服务数字网(ISDN)卡、电缆调制解调器、卫星调制解调器或调制解调器,以便提供到对应类型的电话线路的数据通信连接。作为另一个示例,通信接口 918可以是局域网(LAN)卡,以便提供到兼容的局域网的数据通信连接。还可以实现无线链路。在任意这种实现中,通信接口 918发送和接收携带表示各种类型的信息的数字数据流的电的、电磁的或光信号。
[0226]网络链路920典型地通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路920可以通过局域网922提供到主计算机924或到互联网服务提供者(ISP)926操作的数据装置的连接。ISP926又通过现在通常称为“互联网”928的世界范围分组数据通信网络提供数据通信业务。局域网922和互联网928两者使用携带数字数据流的电子、电磁的或光信号。向和从计算机系统900输送数字数据的通过各种网络的信号和网络链路920上的并且通过通信接口 918的信号是传输介质的示例形式。
[0227]计算机系统900可以通过网络(多个)、网络链路920和通信接口 918发送消息和接收数据,包括程序代码。在互联网的例子中,服务器930可以通过互联网928、ISP926、局域网922和通信接口 918传输用于应用程序的被请求的代码。
[0228]接收的代码在被接收时可被处理器904执行,和/或被存储在存储设备910或其它非易失性存储器内,以便以后执行。
[0229]在上述的说明中,已经参考许多特定细节描述了本发明的实施例,这些细节可以根据实现而改变。因此,应当以说明的意义而不是限制的意义看待说明书和附图。本发明的范围的唯一的和排他的指示,并且被 申请人:旨在作为本发明的范围,是本申请提出的该组权利要求的文字的和同等的范围,以权利要求被提出的特定形式,包括任意随后的修正。
【权利要求】
1.一种方法,包括: 在易失性存储器内保持用于关系型数据库的关系表格的多个列向量; 其中所述多个列向量包括特定列向量; 其中所述特定列向量连续地存储来自所述关系表格的特定列的值; 其中所述特定列向量内的值以特定格式存储在所述易失性存储器中; 其中所述特定格式是(a)压缩格式或(b)可变宽度格式之一; 在数据库命令的执行过程中,以所述特定格式将所述特定列向量的连续部分从所述易失性存储器传输到CPU ; 其中所述连续部分包括与所述关系表格的特定列的多个值对应的第一值集合;以及基于所述第一值集合,针对所述多个值中的每一个值,所述CPU生成对所述每一个值执行所述数据库命令要求的至少一个操作的结果; 其中生成结果的步骤在向CPU传输所述连续部分之后并且在与所述多个值对应的数据在所述易失性存储器和所述CPU之间的任何进一步传输之前执行。
2.如权利要求1所述的方法,其中,生成结果的步骤包括在CPU内执行向量处理操作,所述向量处理操作同时地生成对所述多个值中的所述每一个值执行所述至少一个操作的结果。
3.如权利要求2所述的方法,其中,执行所述向量处理操作是响应于单个SMD指令进行的。
4.如权利要求1所述的方法,其中: 所述数据库命令包括指定涉及来自所述特定列的值的比较操作的谓词;且 所述至少一个操作包括在所述谓词中指定的所述比较操作。
5.如权利要求1所述的方法,其中: 所述至少一个操作涉及来自所述特定列的值和来自所述关系表格中的与所述特定列不同的第二列的值; 其中所述多个列向量中的第二列向量对应于所述第二列;且 该方法还包括,在所述数据库命令的执行过程中,从所述易失性存储器向所述CPU传输所述第二列向量的一系列连续值。
6.如权利要求1所述的方法,其中,所述特定格式是压缩格式。
7.如权利要求6所述的方法,其中: 在所述压缩格式内,由指针表示来自所述特定列的值;且 生成执行所述至少一个操作的结果涉及对所述指针执行所述至少一个操作。
8.如权利要求7所述的方法,其中: 通过使用一种或多种编码技术来产生所述压缩格式; 所述一种或多种编码技术包括字典编码;且 所述指针是指向用于执行所述字典编码的字典的指针。
9.如权利要求6所述的方法,还包括在生成对所述每一个值执行所述至少一个操作的结果之前,在所述CPU内对所述第一值集合进行解压缩。
10.如权利要求9所述的方法,其中,由所述CPU上存在的专用硬件执行所述解压缩的步骤。
11.如权利要求9所述的方法,其中,响应于执行指令,由所述CPU上的通用硬件执行所述解压缩的步骤。
12.如权利要求6所述的方法,其中,在没有对所述第一值集合进行解压缩的情况下,执行生成结果的步骤。
13.如权利要求9所述的方法,还包括将解码数据从所述易失性存储器传输到所述CPU以使得所述CPU能够对所述压缩值进行解压缩。
14.如权利要求13所述的方法,其中,传输到所述CPU的解码数据是以压缩格式传输到所述CPU的。
15.如权利要求1所述的方法,其中,所述特定格式是可变长度格式。
16.如权利要求5所述的方法,还包括在生成对所述每一个值执行所述至少一个操作的结果之前,在所述CPU内对所述第一值集合进行填充。
17.如权利要求16所述的方法,其中,由所述CPU上存在的专用硬件执行对所述第一值集合的填充。
18.如权利要求16所述的方法,其中,响应于执行指令,由所述CPU上的通用硬件执行对所述第一值集合的填充。
19.如权利要求5所述的方法,其中,在没有对所述第一值集合进行填充的情况下,执行生成结果的步骤。
20.如权利要求19所述的方法,其中,生成结果的步骤包括在所述CPU内直接对可变长度格式的所述第一值集合执行向量处理操作。
21.一种非暂时性计算机可读存储介质,其存储有指令,所述指令在由一个或多个处理器执行时导致权利要求1-20中的任一项所述的方法被执行。
22.—种计算设备,配置为执行权利要求1-20中的任一项所述的方法。
【文档编号】G06F17/30GK104040541SQ201280066309
【公开日】2014年9月10日 申请日期:2012年12月7日 优先权日:2011年12月8日
【发明者】L·J·艾利松, A·加尼萨, V·玛瓦, J·卡姆普, A·C·帕蒂哈克, S·K·查万, M·J·格尔森, A·L·霍利维, M·巴哈塔查尔瓦 申请人:甲骨文国际公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1