一种基于向量化执行的数据库排序方法及系统与流程

文档序号:16263557发布日期:2018-12-14 21:46阅读:401来源:国知局
一种基于向量化执行的数据库排序方法及系统与流程

本发明涉及数据管理领域,具体涉及一种基于向量化执行的数据库排序方法及系统。

背景技术

在数据库领域中,排序(sort)是最为重要的操作之一,广泛被用于实现:分组(grouping)、聚合(aggregation)、连接(join)和shuffle等操作。为了处理任意大小的数据集(可能大于内存容量),数据库中的sort一般均指的是外部排序(externalsort)。外部排序算法可分为两个阶段,被称为两阶段多路归并排序(two-phase,multiwaymerge-sort,tpmms),其过程如下:

1)基于内存的排序,将需要排序的数据在内存中进行缓存,当无更多可用内存时,进行一次基于内存数据的局部排序,并将结果溢写(spill)到磁盘文件中。

2)当所有需要排序的数据都进行完内存排序,形成多个局部序时,采用多路归并算法同时处理多个局部序,并生成最终的、全局的序。

向量化执行(vectorizedexecution)是最早在分析型数据库monetdb中提出的,提升分析类(analytical)查询执行性能的执行引擎优化技术。

为了执行一条sql查询,执行引擎会按照其语义将执行逻辑组织成一棵算子树,如图1a所示,传统执行引擎的算子树每次处理一条记录最终产生结果,而vectorizedexecution将迭代粒度从一行变成了行组(recordbatch),如图1b所示,在recordbatch内逻辑数据行record(如图2a所示)逐列组织在一起(如图2b所示),并逐列处理。

通过将迭代粒度变为每次处理recordbatch,recordbatch内按列组织、逐列处理,vectorizedexecution被证明可以有效提升分析类查询的执行效率。其优势具体在于减少解释执行开销:从每次处理一行变为每次处理行组(n行),函数调用数目减少为原来的1/n;更好的数据局部性和代码局部性,因而可以更好地利用到cpucache;为编译器和cpu提供了进一步自动优化的可能性。

为了在分析型数据库中实现向量执行,其关键问题之一就在于如何高效地实现向量化sort。

timsort是结合了合并排序(mergesort)和插入排序(insertionsort)的混合排序算法,这种算法首先识别数据中已经存在的顺序,而后利用这些局部序的知识来更高效地排出全序。概括地说,timsort分成了两个过程:1)识别(排列)大于最小个数序列(identifyruns),顺序扫描要sort的序列,识别其中的有序部分(或对无序数据进行插入排序),使得有序部分长度达到算法设定的最小值(minimumsize);2)将识别出的最小序两两合并(mergesort)最终拿到全序。

针对sort的优化当前有:

1、cache-conscioussort(cache感知的sort):为了充分利用cpu访问数据时,访问cpucache速度远快于访问内存速度这一特点,alphasort将tpmms的第一阶段内存局部排序进一步划分成了两个部分:基于cache的排序(将到达的数据缓存在cache中,cache满时排局部序并进行记录)和内存中的归并排序(将基于cache的局部序合并成更大的基于内存的局部序)。缺点在于:alphasort是基于行,而非recordbatch的;内存中的归并排序在比较时无法避免对内存的随机访问。

2、vectorizedsort:apachedrill是一个基于大规模并行数据库(mpp)架构的数据分析系统,它采用了向量化执行技术来提升查询分析速度。它的内存排序也是两阶段的:对于到达的vectorizedrecordbatch,进行一次局部排序,并将序结果存储在一个数组(sortindexarray)中(数组的每行表示batch中的行在序中的出现位置),当内存满时,根据合并多个序数组,生成一个基于内存的局部序。缺点在于:recordbatch粒度不一定是cache最优;在进行内存排序时,按照序数组(sortindexarray)访问内存中的数据实际上仍是对内存的随机访问,性能很差。



技术实现要素:

针对上述问题,本发明提出一种向量化执行的数据库排序方法,包括:步骤1,将输入数据向量化为多个输入数据行组;步骤2,在计算节点的内存中开辟大小为最适粒度的缓冲区;步骤3,将该输入数据行组依次追加至该缓冲区的末尾空位;仅当该缓冲区满或所有该输入数据行组均已追加至该缓冲区时,将存入该缓冲区的输入数据行组调入该计算节点的处理器缓存进行排序以得到缓存输出数据行组,将该缓存输出数据行组输出至该内存并清空该缓冲区;重复步骤3直到所有该输入数据行组均已完成排序;步骤4,当该内存满或所有该缓存输出数据行组均已输出至该内存时,将该内存中的该缓存输出行组排序以生成输出数据行组,将该输出数据行组保存至该计算结点的磁盘并释放该内存;重复步骤4直到所有该缓存输出数据行组均已完成排序;步骤5,合并所有该输出数据行组以得到顺序排列的全序输出数据行组。

本发明所述的数据库排序方法,其中该最适粒度的大小为当前可用的该处理器缓存的大小除以最大排序/重排宽度所得的值;其中该最大排序/重排宽度为所有该输入数据行组的所有排序列宽度总和与最大单列宽度中的最大值。

本发明所述的数据库排序方法,其中所述步骤3的排序过程具体包括:步骤31,以该缓冲区中的输入数据行组为第一行组,将该第一行组调入该处理器缓存,对该第一行组进行排序以获得对应该第一行组的每行的排序行号并生成第一行号数组;步骤32,根据该第一行号数组对该第一行组进行重新组织,以生成顺序排列的该缓存输出行组;步骤33,将该缓存输出行组输出至内存并清空该缓冲区。

本发明所述的数据库排序方法,其中所述步骤4的排序过程具体包括:步骤41,以该内存中的缓存输出行组为第二行组,对该第二行组进行排序以获得对应该第二行组的每行的排序行号并生成第二行号数组;步骤42,根据该第二行号数组对该第二行组进行重新组织,以生成顺序排列的该输出数据行组;步骤43,将该输出数据行组保存至该磁盘并释放该内存。

本发明所述的数据库排序方法,其中步骤3中采用逐列拷贝将该输入数据行组追加至该缓冲区。

本发明还涉及一种向量化执行的数据库排序系统,其特征在于,包括:

向量化模块,用于将输入数据向量化为多个输入数据行组;

缓冲区模块,用于在处理器缓存中开辟大小为最适粒度的缓冲区;

数据输入模块,用于将该输入数据行组拷贝并依次追加至该缓冲区的末尾空位;

缓冲区数据排序模块,用于对缓冲区内的输入数据行组进行排序;其中仅当该缓冲区满时,对存入该缓冲区的输入数据行组进行排序以得到缓存输出数据行组,将该缓存输出数据行组输出至该内存并清空该缓冲区;

缓冲区数据输出模块,用于将该缓冲区数据排序模块获得的多个该缓存输出数据行组输出至该内存;其中将该缓存输出数据行组依次追加至该内存的末尾空位;

内存数据排序模块,用于对该内存中的缓存输出行组进行排序以生成输出数据行组;其中当该内存满或所有该缓存输出数据行组均已追加至该内存时,将该内存中的缓存输出行组排序以生成输出数据行组。

本发明所述的数据库排序系统,其中该最适粒度的大小为当前可用的该处理器缓存的大小除以最大排序/重排宽度所得的值;其中该最大排序/重排宽度为所有该输入数据行组的所有排序列宽度总和与最大单列宽度中的最大值。

本发明所述的数据库排序方法,其中该缓冲区数据排序模块包括:

缓存排序模块,用于对该缓冲区中的输入数据行组进行排序;其中以该缓冲区中的输入数据行组为第一行组,将该第一行组调入该处理器缓存,并对该第一行组进行排序获得对应该第一行组的每行的排序行号以生成第一行号数组;

缓存重排序模块,用于获取该缓存输出行组;其中根据该第一行号数组对该第一行组进行重新组织,以生成顺序排列的该缓存输出行组;

缓存输出模块,用于将该缓存输出行组输出至内存并清空该缓冲区。

本发明所述的数据库排序系统,其中该内存数据排序模块包括:

内存排序模块,用于对该内存中的缓存输出行组进行排序;其中以该内存中的缓存输出行组为第二行组,对该第二行组进行排序以获得对应该第二行组的每行的排序行号并生成第二行号数组;

内存重排序模块,用于获取该输出数据行组;其中根据该第二行号数组对该第二行组进行重新组织,以生成顺序排列的该输出数据行组;

内存输出模块,用于将该输出数据行组保存至该磁盘并释放该内存。

本发明所述的数据库排序系统,其中该数据输入模块中采用逐列拷贝将将该输入数据行组拷贝至该缓冲区。

附图说明

图1a是传统执行引擎的算子树处理记录示意图。

图1b是向量化执行引擎的算子树处理记录示意图。

图2a、图2b是recordbatch内部数据结构示意图。

图3是本发明的一种向量化执行的数据库排序方法流程图。

图4是本发明的一种向量化执行的数据库排序方法缓存排序步骤流程图。

图5是本发明的一种向量化执行的数据库排序方法内存排序步骤流程图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图,对本发明提出的基于向量化执行的数据库排序方法及系统进一步详细说明。应当理解,此处所描述的具体实施方法仅仅用以解释本发明,并不用于限定本发明。

本发明的目的是解决使用向量化(vectorizedexecution)加速数据查询引擎时如何高效进行外部排序(externalsort)的内存排序部分(in-memorysort)问题,从而提出了一种cpucache友好的向量化排序算法。

图3是本发明的一种向量化执行的数据库排序方法流程图。如图3所示,本发明的排序方法主要包括缓存排序(incachesort)步骤和内存排序步骤,具体包括:

步骤s1,将需要排序的数据(输入数据)划分为多个输入数据行组,以使排序过程的处理对象不再是单独的数据行,而是向量化的数据行组;

步骤s2,在计算结点的内存中开辟缓冲区,其中缓冲区的排序粒度大小为最适粒度,最适粒度为当前可用处理器缓存的大小除以最大排序/重排宽度所得的值,最大排序/重排宽度为所有输入数据行组的所有排序列宽度总和与最大单列宽度中的最大值;

步骤s3,将向量化的输入数据行组逐列拷贝至缓冲区,并依次追加至缓冲区的末尾空位;当缓冲区满时,或所有剩余的输入数据行组均已拷贝至缓冲区时,计算节点的处理器将存入该缓冲区的输入数据行组调入计算节点的处理器缓存进行排序以得到缓存输出数据行组,将该缓存输出数据行组输出至该内存并清空该缓冲区;

步骤s4,重复步骤s3,直到所有向量化的输入数据行组均经过计算节点的处理器的处理完成排序,这样就生成了一个或多个缓存输出数据行组;

步骤s5,一个或多个缓存输出数据行组输出至计算节点的内存,当内存满或所有该缓存输出数据行组均已输出至该内存时,将内存中的缓存输出行组排序以生成输出数据行组,将该输出数据行组保存至该计算结点的磁盘并释放内存;

步骤s6,重复步骤s5直到所有缓存输出数据行组均经过计算节点的处理器的处理完成排序,这样就生成了一个或多个数据数据行组;

步骤s7,合并所有该输出数据行组以得到顺序排列的全序输出数据行组。

图4是本发明的一种向量化执行的数据库排序方法缓存排序步骤流程图。如图4所示,缓存排序步骤(步骤s3)采用timsort方法,包括:

步骤s31,当缓冲区满,或所有剩余的输入数据行组均已拷贝至缓冲区时,对缓冲区中的输入数据行组进行排序,获得对应输入数据行组的每行的排序行号,并将排序行号生成行号数组;如对输入数据行组cbda进行排序得到行号数组3241;

步骤32,根据行号数组对缓冲区中的输入数据行组进行重新组织,生成顺序排列的缓存输出行组;如根据行号数组3241,将输入数据行组cbda重新组织为缓存输出行组abcd;

步骤33,将缓存输出行组输出至计算节点的内存并清空该缓冲区。

图5是本发明的一种向量化执行的数据库排序方法内存排序步骤流程图。如图5所示,内存排序步骤(步骤s5)也采用timsort方法,包括:

步骤s51,当计算节点的内存满,或所有剩余的缓存输出行组均已拷贝至内存时,对内存中的缓存输出行组进行排序,获得对应缓存输出行组的每行的排序行号,并将排序行号生成行号数组;

步骤52,根据行号数组对内存中的缓存输出行组进行重新组织,生成顺序排列的输出数据行组;

步骤53,将输出数据行组保存至计算节点的磁盘并释放内存。

具体来说,本发明包括在排序前缓存多个输入数据行组(recordbatch)至最优cpucache排序粒度(最适粒度)的缓存机制,包括:

1、cpucache内最适排序粒度的计算方法——最适粒度(即每次缓存内排序记录数)等于当前可用cache大小除以最大排序/重排行宽,其中最大排序/重排行宽为所有排序列宽度和与最大单列宽度的较大值;

2、聚集多个recordbatch至最适粒度的缓存方式:在内存中开辟一块大小为最适粒度的recordbatch做缓冲区,对到来需要排序的recordbatch,追加至缓冲区末尾空位,若缓冲区已满,则将当前缓冲区排序并清空缓冲区,若缓冲区不满,则暂不排序;

3、将recordbatch拷贝至缓冲区的方式为逐列拷贝,以获得更高的拷贝效率;

4、采用更优的排序算法加速incache排序:由于排序列通常会有有序、近似有序的特点,因此选用timsort,而非传统的quicksort算法,以充分利用数据本身有序性,加速对缓冲区的incache排序;

5、将排序结果输出为行号数组(sortindexarray),按下标逐一遍历数组可得到按排序列的数据访问;

6、根据排序结果(行号数组)对缓冲区数据进行重排的机制:按照sortindexarray,将缓冲区中数据逐列重排,形成一个在排序列上实际有序的新recordbatch,并将这个recordbatch保存在内存中。

本发明还包括更优的排序算法加速内存中(inmemory)排序,包括:

1、在内存满时,其中保存了大量的、由3生成的局部有序的recordbatch,为了生成一个内存全局序,采用opt-timsort算法以加速排序;原始的timsort算法分为两步,识别有序部分和归并排序。opt-timsort针对已知每个局部序特性,避免timsort的识别序过程,进一步加速timsort排序。

本发明提出的vectorizedexternalsort,解决了现有的外部排序算法的内存排序中对cpucache不友好的问题。通过缓存到达数据至最优cache排序粒度、选用优化的排序算法、重排数据等一系列方法,实现了cpucache友好的外部排序算法。图5展示了vectorizedsort的内存排序流程。

如图5所示,本发明的内存排序分成两个阶段,incache的排序和inmemory的局部序的合并:数据首先在cache中进行聚集、到达最佳粒度后进行in-cachetimsort,并根据sort得出的序重排(re-arrange)数据,将重排后的数据缓存在内存中,最后,当无更多可用内存时,进行局部序的合并,得到内存中数据的全序。

本发明的目的是:

1、找到最优的incache排序粒度,缓存到达的recordbatch至最优粒度;

2、高效进行incache排序,采用timsort最大利用数据潜在序;

3、incache排序后数据的重新组织,按照序关系重组cache中数据,使得后续对数据的访问顺序化;

4、内存排序的优化,利用记录的cache数据的已有序,避免序的二次识别。

实例1:缓存数据至最佳cache排序粒度

在向量化引擎中,数据的迭代粒度(recordbatch)并不是最适的incachesort粒度。因此需要在incachesort之前进行数据的聚合,最适的排序粒度(子不是粒度)为:

由于参与排序的列可能有多个,因此要保证所有排序列vector可以同时放入cache,而在后续重排(reorder)过程中,是逐列进行的,因此也要保证最大的列vector可以放入cache,因此由如上的最适排序粒度。

实例2:优化的incache排序

利用timsort算法对incache数据进行排序,排序结果输出为一个sortindexarray。

实例3:incache数据的重新组织

根据sortindexarray,逐vector重排cache中的数据,产生的结果是实际有序的数据(之后不再需要sortindexarray)。

实例4:优化的内存数据排序

修改timsort算法,将经过cache排序的局部序的run标注给timsort,使得timsort可以直接进行mergesort部分。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1