本发明属于数据库,具体为一种基于列存储格式的数据库并行聚合方法、计算机设备及存储介质。
背景技术:
::1、数据库中的聚合操作是对查询的结果先进行分组,并在分组过程中对需要进行聚合计算的字段进行聚合处理。通常聚合操作有两种实现算法:sort聚合和hash聚合。2、传统基于hash实现的多列聚合算法中需要对每一条记录中需要分组的字段计算hash值,并且需要通过封装或拼接的方式实现多个字段的比较函数,当发生hash冲突时再通过比较函数进行分组。这种方案性能较低,访问hashtable的次数较多,由于编程语言中对象的比较成本远高于原生数据类型的比较,导致通过拼接和封装方式比较的成本较高,性能低下。3、基于hash实现的多列聚合算法中还是以行的形式进行扫描数据,当数据库中的数据组织方式为列的形式时,由于该算法对内存的访问是随机访问的,且现代cpu的架构以顺序的形式访问内存性能更高,相比较而言该算法在列数据中实现的性能较低。4、传统基于hash实现的多列聚合算法中通过一个hashtable对数据进行分组,导致该算法的并行度受限于hashtable并行度较低,所以传统数据库通常采用单线程的模式进行聚合计算。技术实现思路1、发明目的:为解决现有基于hash实现的多列聚合算法中存在的性能低、仅能采用单线程的模式进行聚合计算等问题,本发明提出了一种基于列存储格式的数据库并行聚合方法、计算机设备及存储介质,实现基于列存储格式的数据库单列或多列的数据聚合。2、技术方案:一种基于列存储格式的数据库并行聚合方法,包括以下步骤:3、步骤1:将待聚合数据划分为若干数据块,每块数据块包括多个基于列存储格式的聚合字段值;4、步骤2:将所有数据块分配给多个分组任务并发执行对行位置的分组操作,得到包括多条记录的分片子表;对于任意一分组任务,依据第一列聚合字段值对行位置信息进行分组,得到包括多条记录的第一分片子表,每条记录用以聚合字段值列表为key、行位置序列为value的哈希表表示;对于第一分片子表的每条记录,从记录中获取行位置序列中的行位置信息,并根据取得的行位置信息,从第二列聚合字段值中获取对应的聚合字段值,在第一分片子表的基础上,依据该聚合字段值对行位置信息进行再分组,得到包括多条记录的第二分片子表;以此类推,最后一列聚合字段值对应的分片子表即为该分组任务得到的包括多条记录的分片子表;5、步骤3:对所有分组任务的分片子表进行合并,得到分片;6、步骤4:对所有分片进行合并,得到聚合结果。7、进一步的,依据第一列聚合字段值对行位置信息进行分组,得到包括多条记录的第一分片子表,具体操作包括:8、判断第一列聚合字段值上是否有未被使用过的行位置pos,若没有,则表示第一列聚合字段值上的所有行位置均已被使用,则完成分组,得到包括多条记录的第一分片子表;若有,则判断在行位置pos处的聚合字段值f[pos]能否在第一分片子表中查到,若能查到,则在第一分片子表中相应的行位置序列中添加行位置pos,再重复执行本步骤;若查不到,则建立新的聚合字段值列表key,并添加f[pos],建立新的行位置信息序列p,并添加初始元素pos,形成新的记录{key,p},将新的记录添加至第一分片子表,再重复执行本步骤。9、进一步的,所述的对于第一分片子表的每条记录,从记录中获取行位置序列中的行位置信息,并根据取得的行位置信息,从第二列聚合字段值中获取对应的聚合字段值,在第一分片子表的基础上,依据该聚合字段值对行位置信息进行再分组,得到包括多条记录的第二分片子表,具体操作包括:10、判断第一分片子表中是否有未使用过的记录rec,若没有,则得到包括多条记录的第二分片子表;若有,则判断记录rec中的行位置pos是否唯一,若唯一,则取记录rec中的行位置pos,将行位置pos的聚合字段值f[pos]追加至记录rec的聚合字段值列表中,将该记录rec添加至第二分片子表中,再重复执行本步骤;若不唯一,则建立以聚合字段值为键、行位置序列的指针为值的哈希表h,按序取记录rec中的行位置pos,若行位置pos的聚合字段值f[pos]已存在于哈希表h中,则根据聚合字段值f[pos]对应的行位置序列的指针取得行位置序列,在该行位置序列中添加行位置pos;若行位置pos的聚合字段值f[pos]不存在于哈希表h中,则构建新记录rec2{key,p},其中,新记录rec2中的key为行位置pos的聚合字段值f[pos],p为新的行位置序列,初始元素为pos,将新记录rec2{key,p}添加至第二分片子表中,并将{f[pos],rec2值的指针}添加到哈希表h,rec2值的指针为新的行位置序列的指针,再重复执行本步骤。11、进一步的,所述的对所有分组任务的分片子表进行合并,得到分片,具体包括:12、对key相同的所有行位置序列,通过聚合算子进行合并,得到合并后的聚合结果,得到分片。13、本发明公开了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现一种基于列存储格式的数据库并行聚合方法的步骤。14、本发明公开了一种存储介质,所述存储介质存储有并行聚合程序,所述并行聚合程序被至少一个处理器执行时实现一种基于列存储格式的数据库并行聚合方法的步骤。15、有益效果:本发明与现有技术相比,具有以下优点:16、(1)本发明方法为针对于列存储格式的聚合算法,以列形式扫描数据进行分组的聚合计算,能有效提升数据扫描的性能;17、(2)本发明方法将多列的聚合计算,拆分成对每个单独列的聚合计算,减少hashtable的访问和复合key的比较操作;通过预先对每个列独立操作避免对内存的随机访问,充分利用现代cpu架构特性提升分组性能;18、(3)本发明方法通过对每列单独分组避免了对多个分组字段比较时的拼接和封装,在实现时宽字节数据类型(例如:字符串类型)比较算法时可以使用simd指令进行流指令比较操作,提升比较性能;19、(4)本发明方法解决传统hash集合算法中hashtable导致的性能瓶颈,通过分片的技术提升数据库聚合算法的并行度;20、(5)本发明方法根据列存储格式的数据的特性,使用符合现代cpu架构数据访问操作,提升聚合分组的性能。通过将分组任务拆分、数据分片的方式将聚合操作拆分成一个个子任务,每个子任务之间没有依赖关系,并行执行提升数据库的聚合算法的性能。技术特征:1.一种基于列存储格式的数据库并行聚合方法,其特征在于:包括以下步骤:2.根据权利要求1所述的一种基于列存储格式的数据库并行聚合方法,其特征在于:所述的依据第一列聚合字段值对行位置信息进行分组,得到包括多条记录的第一分片子表,具体操作包括:3.根据权利要求1所述的一种基于列存储格式的数据库并行聚合方法,其特征在于:所述的对于第一分片子表的每条记录,从记录中获取行位置序列中的行位置信息,并根据取得的行位置信息,从第二列聚合字段值中获取对应的聚合字段值,在第一分片子表的基础上,依据该聚合字段值对行位置信息进行再分组,得到包括多条记录的第二分片子表,具体操作包括:4.根据权利要求1所述的一种基于列存储格式的数据库并行聚合方法,其特征在于:所述的对所有分组任务的分片子表进行合并,得到分片,具体包括:5.一种计算机设备,其特征在于,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现权利要求1至4任意一项所述的一种基于列存储格式的数据库并行聚合方法的步骤。6.一种存储介质,其特征在于,所述存储介质存储有并行聚合程序,所述并行聚合程序被至少一个处理器执行时实现权利要求1至4任意一项所述的一种基于列存储格式的数据库并行聚合方法的步骤。技术总结本发明公开了基于列存储格式的数据库并行聚合方法、计算机设备及存储介质,包括:将待聚合数据划分为若干数据块;将所有数据块分配给多个分组任务并发执行对行位置的分组操作,得到分片子表;对于任意一分组任务,依据第一列聚合字段值对行位置信息进行分组,得到包括多条记录的第一分片子表,对于第一分片子表的每条记录,从记录中获取行位置序列中的行位置信息,并根据取得的行位置信息,从第二列聚合字段值中获取对应的聚合字段值,在第一分片子表的基础上,依据该聚合字段值对行位置信息进行再分组,得到包括多条记录的第二分片子表;以此类推;对所有分组任务的分片子表进行合并,得到分片;对所有分片进行合并,得到聚合结果。技术研发人员:张东,赵远方,付新,王学海,姜久文受保护的技术使用者:达梦数据技术(江苏)有限公司技术研发日:技术公布日:2024/1/15