基于列式存储的流水排序方法技术

技术编号:35520063 阅读:14 留言:0更新日期:2022-11-09 14:38
本发明专利技术涉及一种基于列式存储的流水排序方法,其技术特点是:包括异步IO线程、流水化线程和排序线程,其根据所有CU的元信息构建CU序列,并根据CU序列的最小值信息构造边界序列,在排序过程中,将CU视为一个数据集合,对于相邻的两个CU,使用后一个CU的最小值做边界将数据划分为两部分,前一部分可以作为子集合单独排序,后一部分和第二个CU组成一个新的集合,再和后面的CU继续进行相同的处理,实现流水排序。本发明专利技术设计合理,实现了对采用列式存储并且近似有序的数据集合进行快速排序功能,具有处理速度快、占用资源小等特点。占用资源小等特点。占用资源小等特点。

【技术实现步骤摘要】
基于列式存储的流水排序方法


[0001]本专利技术属于数据库
,尤其是一种基于列式存储的流水排序方法。

技术介绍

[0002]数据仓库通常存储有海量的原始数据,为用户通过报表、看板等工具从数据中获得洞察力、决策指导。数据仓库中的事实表是指保存了大量业务度量数据的表,也是数据仓库最核心的表。通常最有用的事实就是数字类型的事实和可加类型的事实,例如:销售金额、成本等。通常事实表中的数据不允许修改,新的数据只是简单地添加进去。事实表的特点是:数据量庞大、属性列数少、持续增长,通俗理解实事表就是一张完整详尽的业务表,而且会持续不断有新的数据加进来。
[0003]图1给出了一个比较典型的用于记录商品销售记录的事实表结构。事实表的记录通常会按照时间、主键等字段近似有序,或称为具有有序趋势,比如图1中的“销售时间”。而数据仓库提供的很多操作也会基于这些近似有序的字段进行排序,以图1的商品销售记录事实表为例,典型的业务有:
[0004](1)绘制编号为1010的商品的销售额曲线图。这需要在检索并计算得到该商品的结果后按照销售时间排序。SQL语句如下:
[0005]SELECT销售时间,实时价格*折扣*销售数量
[0006]FROM商品销售记录
[0007]WHERE商品编号=1010
[0008]ORDER BY销售时间;
[0009](2)以小时为单位生成所有商品销售额的报表。这需要用到分组操作,因为分组结果集非常大,必须要采用排序聚合的分组算法。SQL语句如下:/>[0010]SELECT to_char(销售时间,'yyyy

mm

dd,hh24'),sum(实时价格*折扣*销售数量)
[0011]FROM商品销售记录
[0012]GROUP BYto_char(销售时间,'yyyy

mm

dd,hh24')。
[0013]由于数据仓库处理的数据范围跨度通常非常大,这也就意味着待排序的数据量也会非常大,甚至会超出物理内存,因此对超出物理内存的庞大规模数据集合排序,通常采用归并排序算法,因为归并排序需要进行频繁的IO读写,所以排序性能也会奇慢无比。即使待排序的数据集合可以完全装入物理内存并采用更高效的快速排序算法,也会因为巨大的数据集合而产生非常大的内存和计算开销。另外,排序算法需要借助物化在完全排序后才可以返回结果(堆排序算法可以提前返回,但仍需要预先比较判断一遍所有数据),在数据仓库中通常称为启动代价大,因此,看似简单的绘制曲线图和制作报表会涉及到很大的资源开销。
[0014]数据仓库中的时间、主键这些字段近似有序,主要是因为虽然这些数据是顺序产生的,但由于并发装载入库和补录历史记录操作,使得最终存储的数据并不完全有序。再观
察商品销售记录事实表的销售时间字段,会发现比较少量的无序记录,通常称为“异常”值,如图2所示。
[0015]目前,数据仓库为了优化统计查询性能经常会采用列式存储方式,图3给出了一种商品销售记录表的列式存储示意图。列式存储通常由多个被称为Compress Unit(压缩单元,简称:CU)的存储单元构成。每一个CU由元信息和压缩数据组成,元信息包括该CU单元的统计信息,包括最小值、最大值以及记录数,压缩数据部分包含实际的数据。列式存储结构的数据仓库同样存在排序速度慢、占用资源大等的问题,如何对列式存储结构的排序操作进行性能优化是目前迫切需要解决的问题。

技术实现思路

[0016]本专利技术的目的在于克服现有技术的不足,提供一种设计合理、处理速度快且占用资源小的基于列式存储的流水排序方法。
[0017]本专利技术解决现有的技术问题是采取以下技术方案实现的:
[0018]一种基于列式存储的流水排序方法,包括异步IO线程、流水化线程和排序线程,并按照以下步骤实现:
[0019]步骤1、排序线程申请两个固定大小的第一排序缓冲块和第二排序缓冲块;
[0020]步骤2、异步IO线程依次读取列式存储中的所有CU的元信息,并记录每个CU的最小值和最大值;
[0021]步骤3、流水化线程按照CU的最小值对所有CU进行排序,构造CU序列和边界序列;
[0022]步骤4、流水化线程检测CU序列是否已空,如果CU序列已空,则跳转至步骤11,否则,获取一个CU序号并唤醒异步IO线程;
[0023]步骤5、流水化线程获取该CU序号所对应的边界作为比较基值,如果该CU序号是CU序列的最后一个CU,则使用该CU的最大值做为比较基值;
[0024]步骤6、流水化线程从压缩单元CU读取CU的数据,进行解压;
[0025]步骤7、流水化线程将CU的最大值与比较基值进行判断,如果CU的最大值小于比较基值,则将数据写入第一排序缓冲块,跳转至步骤9,否则进入步骤8;
[0026]步骤8、流水化线程遍历CU序列的CU记录,并同比较基值进行比较,如果小于比较基值则写入第一排序缓冲块,否则写入第二排序缓冲块;
[0027]步骤9、流水化线程处理CU的所有记录,如果存在相同边界值的其他CU,跳转至步骤4,否则,将第一排序缓冲块放入待排序队列,唤醒排序线程;
[0028]步骤10、流水化线程将第二排序缓冲块重命名为第一排序缓冲块,并重新申请第二排序缓冲块,跳转至步骤4;
[0029]步骤11、如果第一排序缓冲块非空,将第一排序缓冲块放入待排序队列,等待排序线程处理;
[0030]步骤12、排序线程依次执行排序任务,直至流水排序结束。
[0031]进一步,所述步骤3的具体实现方法包括以下步骤:
[0032]⑴
将所有CU按照最小值进行排序;
[0033]⑵
将最小值相同的CU进行合并,构造出CU序列;
[0034]⑶
根据CU序列的最小值,确定CU边界值;
[0035]⑷
根据CU边界值并使用结合律,构造出边界序列,该边界序列为一系列不相交的子集合。
[0036]本专利技术的优点和积极效果是:
[0037]本专利技术设计合理,其将一个大数据集合的整体排序拆分为对一系列小数据集合的流水顺序排序方法,由于流水排序具有内存开销小、响应延迟低的特点,并且空间复杂度和时间复杂度全面优于普通排序,即使对于数据完全无序的情况,流水排序将自动退化为普通排序,不会带来任何额外的开销,从而实现了对采用列式存储并且近似有序的数据集合进行快速排序功能,具有处理速度快、占用资源小等特点。
附图说明
[0038]图1是一种现有商品销售记录表结构示意图;
[0039]图2是一种现有商品销售记录“异常”值示意图;
[0040]图3是一种商品销售记录列式存储结构示意图;
[0041]图4是本专利技术的CU序列和边界序列关系示意图;
[0042]图5是本专利技术的流水排序过程示意图。
具体实施方式本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.一种基于列式存储的流水排序方法,其特征在于:包括异步IO线程、流水化线程和排序线程,并按照以下步骤实现:步骤1、排序线程申请两个固定大小的第一排序缓冲块和第二排序缓冲块;步骤2、异步IO线程依次读取列式存储中的所有CU的元信息,并记录每个CU的最小值和最大值;步骤3、流水化线程按照CU的最小值对所有CU进行排序,构造CU序列和边界序列;步骤4、流水化线程检测CU序列是否已空,如果CU序列已空,则跳转至步骤11,否则,获取一个CU序号并唤醒异步IO线程;步骤5、流水化线程获取该CU序号所对应的边界作为比较基值,如果该CU序号是CU序列的最后一个CU,则使用该CU的最大值做为比较基值;步骤6、流水化线程从压缩单元CU读取CU的数据,进行解压;步骤7、流水化线程将CU的最大值与比较基值进行判断,如果CU的最大值小于比较基值,则将数据写入第一排序缓冲块,跳转至步骤9,否则进入步骤8;步骤8、流水化线程遍历CU序列的CU记录,并同比较基值进行比较,如...

【专利技术属性】
技术研发人员:李晓鹏贾宗秀刘尧姬涛涛蒋旭张昕尧赵冬伟朱亚楠吴嵩周勇亮刘勇生桑国彪乐承予
申请(专利权)人:天津神舟通用数据技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1