CN117493386B - 数据库访问方法及装置、存储介质和电子设备 - Google Patents

数据库访问方法及装置、存储介质和电子设备 Download PDF

Info

Publication number
CN117493386B
CN117493386B CN202311855864.7A CN202311855864A CN117493386B CN 117493386 B CN117493386 B CN 117493386B CN 202311855864 A CN202311855864 A CN 202311855864A CN 117493386 B CN117493386 B CN 117493386B
Authority
CN
China
Prior art keywords
data
target
rams
mth
column
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202311855864.7A
Other languages
English (en)
Other versions
CN117493386A (zh
Inventor
刘科
张闯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Suzhou Metabrain Intelligent Technology Co Ltd
Original Assignee
Suzhou Metabrain Intelligent Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Suzhou Metabrain Intelligent Technology Co Ltd filed Critical Suzhou Metabrain Intelligent Technology Co Ltd
Priority to CN202311855864.7A priority Critical patent/CN117493386B/zh
Publication of CN117493386A publication Critical patent/CN117493386A/zh
Application granted granted Critical
Publication of CN117493386B publication Critical patent/CN117493386B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24532Query optimisation of parallel queries
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation
    • G06F16/24535Query rewriting; Transformation of sub-queries or views
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/24569Query processing with adaptation to specific hardware, e.g. adapted for using GPUs or SSDs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/907Retrieval characterised by using metadata, e.g. metadata not derived from the content or metadata generated manually

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Library & Information Science (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请实施例提供了一种数据库访问方法及装置、存储介质和电子设备,其中,该方法包括:将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM;在目标页面包括M行数据的情况下,从N个RAM中读取M行数据中的每行数据的元信息,得到M个元信息;根据M个元信息,确定M个拆分元信息;根据M个拆分元信息,从N个RAM中并行读取目标页面中的数据,并以数据分段为单位依次将M行数据中的每行数据被拆分成的数据分段发送到解析模块;通过解析模块从M行数据中获取至少部分列数据,并对至少部分列数据执行目标查询操作。通过本申请,解决了数据库访问效率较低的问题,进而达到了提升数据库访问效率的效果。

Description

数据库访问方法及装置、存储介质和电子设备
技术领域
本申请实施例涉及计算机领域,具体而言,涉及一种数据库访问方法及装置、存储介质和电子设备。
背景技术
随着半导体工艺制程逐渐逼近物理极限,CPU(Central Processing Unit,中央处理器)的性能增长逐渐放缓,摩尔定律逐渐失效。这意味着传统的方式通过增加CPU数量和提升主频来提高整体性能的方法变得越来越困难。
然而,与此同时,大数据的不断发展导致数据量呈现井喷式增加,对服务器的性能提出了新的挑战。单纯地依靠传统的CPU架构已经无法满足处理大规模数据的需求,因此人们开始将研究目光转向了异构计算。
在异构计算中,人们通过专用硬件电路对CPU中的计算密集型算子进行算力卸载,以实现整体性能的提升。在数据库领域,使用GPU(graphics processing unit,图形处理器)、FPGA(Field Programmable Gate Array,现场可编程逻辑门阵列)、ASIC(ApplicationSpecific Integrated Circuit,专门应用的集成电路)等专用硬件对计算密集型的瓶颈进行算力卸载已经取得了一定的进展,可以显著提升查询性能。
然而,传统的行存储数据库的存储格式与查询方式面向CPU设计,其中的不定长数据与定长变长混合存储的方式并不利于发挥专用硬件的性能。现有技术中,只能逐个字节地对数据库的存储页面进行解析,不仅解析效率低下,而且会消耗大量的硬件资源,从而极大地制约了专用硬件的整体性能。因此,在异构计算中实现高效的存储页面解析成为本领域人员亟待解决的问题,可以理解的是,数据库访问效率较低。
发明内容
本申请实施例提供了一种数据库访问方法及装置、存储介质和电子设备,以至少解决相关技术中数据库访问效率较低的问题。
根据本申请的一个实施例,提供了一种数据库访问方法,包括:将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,其中,N为正整数,每个RAM的数据位宽为K个字节,K为2的幂次方;在所述目标页面包括M行数据的情况下,从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,其中,M为正整数,所述M个元信息中的每个元信息包括所述M行数据中对应的一行数据在所述目标页面中的行起始位置和所述对应的一行数据包括的字节数量,在每个时钟周期上从所述N个RAM中并行读取的数据包括N×K个字节的数据;根据所述M个元信息,确定M个拆分元信息,其中,所述M个拆分元信息中的每个拆分元信息包括所述M行数据中对应的一行数据在所述N个RAM中的存储起始位置、所述对应的一行数据包括的字节数量以及所述对应的一行数据被拆分成的数据分段的数量;根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,并以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,其中,在每个时钟周期上从所述N个RAM中并行读取的数据包括所述M行数据中的N×K个字节的数据,每个数据分段被设置为在一个时钟周期上发送到所述解析模块;通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作。
在一个示范性实施例中,所述将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,包括:在每个时钟周期上将所述目标页面中的K个字节的数据写入到所述N个RAM中的一个RAM中,其中,所述目标数据库是所述目标芯片的片外内存中存储的数据库,所述N个RAM按时钟周期被依次写入所述目标页面中的K个字节的数据。
在一个示范性实施例中,所述将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,包括:在第i个时钟周期上,当j不等于0时,将所述目标页面中的第i组数据写入所述N个RAM中的第j个RAM中,当j等于0时,将所述第i组数据写入所述N个RAM中的第N个RAM中,其中,所述第i组数据包括K个字节的数据,i为正整数,j为将i除以N所得的余数,j为正整数。
在一个示范性实施例中,在所述目标数据库或所述目标页面包括多行数据的情况下,N是根据所述多行数据中的每行数据包括的字节数量与所述每个RAM的数据位宽所确定得到的值。
在一个示范性实施例中,N为对目标比值进行向上取整所得到的值,其中,所述目标比值是将目标行长度除以K所得到的比值,所述目标行长度是所述多行数据中的每行数据包括的字节数量的均值,或者,是所述多行数据中的每行数据包括的字节数量中出现次数最多的字节数量。
在一个示范性实施例中,K是所述目标芯片的内部总线所允许读写的最大数据位宽。
在一个示范性实施例中,所述从所述N个RAM中并行读取所述目标页面中的数据,包括:在将所述目标页面中的全部数据写入到所述N个RAM之后,从所述N个RAM中并行读取所述目标页面中的数据。
在一个示范性实施例中,所述将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,包括:在所述目标芯片中具有多个RAM组的情况下,将所述目标页面中的数据写入到所述目标芯片中的第一RAM组中的所述N个RAM,其中,所述多个RAM组中的每个RAM组中包括的RAM的数量均为N;所述根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,包括:根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述目标页面中的数据;所述方法还包括:在所述目标数据库包括一组页面、且所述目标页面是所述一组页面中的第一页面的情况下,在根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述第一页面中的数据的过程中,将所述目标数据库中的第二页面中的数据写入到所述多个RAM组中的第二RAM组包括的N个RAM。
在一个示范性实施例中,在所述多个RAM组为U个RAM组,U是将第一时长除以第二时长所得到的比值,其中,所述第一时长用于表示所述解析模块解析所述目标数据库中的一个页面所需的平均时长,所述第二时长是将W除以K所得到的比值,W表示所述目标数据库中的一个页面中包括的平均字节数量,W为正整数。
在一个示范性实施例中,所述从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,包括:从所述N个RAM中并行读取第一组数据,并从所述第一组数据中获取目标行数,其中,所述第一组数据是所述目标页面中的N×K个字节的数据,所述第一组数据包括所述目标行数,所述目标行数等于M,所述目标行数用于指示所述目标页面中包括的数据的行数为M;在所述第一组数据不包括所述M个元信息的情况下,根据所述目标行数,从所述N个RAM中获取所述M个元信息;在所述第一组数据包括所述M个元信息中的P个元信息的情况下,从所述第一组数据中获取所述P个元信息,并根据所述目标行数,从所述N个RAM中获取所述M个元信息中除所述P个元信息之外的M-P个元信息,其中,P为小于M的正整数。
在一个示范性实施例中,所述根据所述目标行数,从所述N个RAM中获取所述M个元信息,包括:在所述M个元信息中的每个元信息包括R个字节的数据、且M×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M个元信息。
在一个示范性实施例中,所述根据所述目标行数,从所述N个RAM中获取所述M个元信息中除所述P个元信息之外的M-P个元信息,包括:在所述M个元信息中的每个元信息包括R个字节的数据、且(M-P)×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M-P个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M-P个元信息。
在一个示范性实施例中,所述根据所述M个元信息,确定M个拆分元信息,包括:通过以下步骤根据所述M个元信息中的第m个元信息,确定所述M个拆分元信息中的第m个拆分元信息,其中,m为小于或等于M的正整数,所述第m个元信息包括第m个行起始位置和第m个字节数量,所述第m个行起始位置用于表示所述M行数据中的第m行数据在所述目标页面中的行起始位置,所述第m个字节数量用于表示所述第m行数据包括的字节数量:根据所述第m个行起始位置和所述第m个字节数量,确定所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址;根据所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,确定第m个数量,其中,所述第m个数量用于表示所述第m行数据被拆分成的数据分段的数量;根据所述第m个字节数量,确定所述第m行数据在所述N个RAM中的第m个存储起始位置;将所述第m个拆分元信息确定为包括所述第m个存储起始位置、所述第m个字节数量和所述第m个数量。
在一个示范性实施例中,所述第m个拆分元信息包括:第m个行发送间隔计数值,其中,所述第m个行发送间隔计数值用于在第m行数据被拆分成的数据分段的数量大于或者等于2的情况下,所述第m行数据的相邻两个数据分段被发送至所述解析模块之间所间隔的时钟周期,或者在所述第m行数据被拆分成的数据分段的数量为1的情况下,所述第m行数据与所述第m行数据的下一行数据的数据分段被发送至所述解析模块之间所间隔的时钟周期。
在一个示范性实施例中,所述根据所述第m个行起始位置和所述第m个字节数量,确定所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,包括:在所述第m个行起始位置包括所述目标页面中的第Qm个字节的情况下,将所述第m行数据在所述N个RAM中的起始存储地址确定为对Qm/K进行向下取整所得到的值,并将所述第m行数据在所述N个RAM中的结束存储地址确定为对(Qm+所述第m个字节数量)/K进行向上取整所得到的值,其中,Qm为正整数。
在一个示范性实施例中,所述根据所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,确定第m个数量,包括:在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的同一行的情况下,将所述第m个数量确定为等于1;在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的不同行的情况下,将所述第m个数量确定为等于(|A-B|+1),其中,所述起始存储地址表示所述N个RAM中的第A行,所述结束存储地址表示所述N个RAM中的第B行,A和B为正整数,A和B不相同。
在一个示范性实施例中,所述根据所述第m个字节数量,确定所述第m行数据在所述N个RAM中的第m个存储起始位置,包括:在m等于1、且所述第m个字节数量小于或等于N×K的情况下,将所述第m个存储起始位置确定为(N×K-所述第m个字节数量+1);在m等于1、且所述第m个字节数量大于N×K的情况下,将所述第m个存储起始位置确定为(N×K-第m个余数+1),其中,所述第m个余数等于将所述第m个字节数量除以(N×K)所得到的余数;在m大于1、且所述第m个字节数量小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个字节数量),其中,所述第m-1个存储起始位置是所述M行数据中的第m-1行数据在所述N个RAM中的存储起始位置;在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个余数);在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数大于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(N×K-(所述第m个余数-所述第m-1个存储起始位置))。
在一个示范性实施例中,所述以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,包括:在所述M行数据中的一行数据被拆分成多个数据分段的情况下,所述多个数据分段中的相邻两个数据分段间隔T个时钟周期被发送到所述解析模块,其中,T为大于或等于2的正整数,T等于所述解析模块中流水线级数。
在一个示范性实施例中,所述通过所述解析模块从所述M行数据中获取至少部分列数据,包括:在所述解析模块包括按流水线方式工作的T个列解析单元、且在第q个时钟周期上所述T个列解析单元中的第1个列解析单元获取到所述M行数据中的第m行数据中的第r个数据分段的情况下,在所述第q个时钟周期上通过所述第1个列解析单元中获取所述第r个数据分段中的一列数据,从第q+1个时钟周期开始的T-1个时钟周期内将所述第r个数据分段依次从所述第1个列解析单元输入到所述T个列解析单元中的第T个列解析单元,并在从第q+1个时钟周期开始的T-1个时钟周期中的每个时钟周期内,通过所述T个列解析单元中已接收到所述第r个数据分段的每个列解析单元分别获取所述第r个数据分段中不同的一列数据,其中,r为正整数,m为小于或等于M的正整数。
在一个示范性实施例中,所述通过所述解析模块从所述M行数据中获取至少部分列数据,还包括:在所述第r个数据分段不包括所述第m行数据中的目标列数据、且在所述T-1个时钟周期中所述T个列解析单元中的一个列解析单元被设置用于获取所述目标列数据的情况下,当所述一个列解析单元从所述第r个数据分段中获取不到所述目标列数据时,记录所述目标列数据的偏移地址,其中,所述目标查询操作所需查询的列数据集合包括所述目标列数据,所述偏移地址用于获取所述目标列数据;在所述第1个列解析单元获取到所述第m行数据中的第r+t个数据分段的情况下,通过所述第1个列解析单元利用所述目标列数据的偏移地址从所述第r+t个数据分段获取所述目标列数据,其中,t为正整数。
在一个示范性实施例中,所述对所述至少部分列数据执行目标查询操作,包括:将目标查询语句转换为连续的目标码流,其中,所述目标查询语句中携带了所述目标查询操作,所述目标码流中携带了一组运算码;根据所述目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,得到一组比较运算器和一组逻辑运算器;通过所述一组比较运算器和所述一组逻辑运算器对所述至少部分列数据执行所述目标查询操作。
在一个示范性实施例中,所述根据所述目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,得到一组比较运算器和一组逻辑运算器,包括:在所述目标查询语句包括预设的C个比较参数、且一组运算码包括C个比较运算码的情况下,将所述C个比较参数和所述C个比较运算码所对应的C个比较运算配置至C个初始比较运算器,得到C个比较运算器,其中,所述一组初始比较运算器包括所述C个初始比较运算器,所述一组比较运算器包括所述C个比较运算器,C为大于或者等于1的正整数;在所述一组运算码包括D个逻辑运算码的情况下,将C个比较结果和所述D个逻辑运算码所对应的逻辑运算配置至D个初始逻辑运算器,得到D个逻辑运算器,其中,所述C个比较结果是所述C个比较运算器对所述至少部分列数据并行执行C个比较操作得到的,所述一组初始逻辑运算器包括所述D个初始逻辑运算器,所述一组逻辑运算器包括所述D个逻辑运算器,D为大于或者等于1的正整数。
在一个示范性实施例中,所述通过所述一组比较运算器和所述一组逻辑运算器对所述至少部分列数据执行所述目标查询操作,包括:在所述目标查询操作包括C个比较操作和D个逻辑运算操作的情况下,通过C个比较运算器对所述至少部分列数据并行执行所述C个比较操作,得到C个比较结果,其中,C和D为大于或等于2的正整数,所述D个逻辑运算操作包括一级或多级逻辑运算操作,所述一级或多级逻辑运算操作中当前一级逻辑运算操作的结果是下一级逻辑运算的输入;通过D个逻辑运算器对所述C个比较结果逐级执行所述D个逻辑运算操作。
在一个示范性实施例中,在对所述至少部分列数据执行目标查询操作之后,所述方法还包括:在通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作,得到目标查询结果的情况下,将所述目标查询结果写入到所述片外内存中。
在本申请实施例中,还提供了一种数据库访问装置,包括:写入模块,用于将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,其中,N为正整数,每个RAM的数据位宽为K个字节,K为2的幂次方;第一读取模块,用于在所述目标页面包括M行数据的情况下,从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,其中,M为正整数,所述M个元信息中的每个元信息包括所述M行数据中对应的一行数据在所述目标页面中的行起始位置和所述对应的一行数据包括的字节数量,在每个时钟周期上从所述N个RAM中并行读取的数据包括N×K个字节的数据;确定模块,用于根据所述M个元信息,确定M个拆分元信息,其中,所述M个拆分元信息中的每个拆分元信息包括所述M行数据中对应的一行数据在所述N个RAM中的存储起始位置、所述对应的一行数据包括的字节数量以及所述对应的一行数据被拆分成的数据分段的数量;第二读取模块,用于根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,并以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,其中,在每个时钟周期上从所述N个RAM中并行读取的数据包括所述M行数据中的N×K个字节的数据,每个数据分段被设置为在一个时钟周期上发送到所述解析模块;获取模块,用于通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作。
根据本申请的又一个实施例,还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
根据本申请的又一个实施例,还提供了一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项方法实施例中的步骤。
通过本申请,每个RAM的数据位宽为2的幂次方,可以理解的是,在每个时钟周期上可以批量将数据库的数据页面中的2的幂次方的字节写入到N个RAM中,在目标页面包括M行数据的情况下,从N个RAM中读取M行数据中的每行数据的元信息,得到M个元信息,M个元信息中的每个元信息包括M行数据中对应的一行数据在目标页面中的行起始位置和对应的一行数据包括的字节数量,在每个时钟周期上从N个RAM中并行读取的数据包括N×K个字节的数据,可以理解的是,在每个时钟周期上从多个RAM中并行批量地读取多行数据的元信息,根据M个元信息,确定M个拆分元信息,M个拆分元信息中的每个拆分元信息包括M行数据中对应的一行数据在N个RAM中的存储起始位置、对应的一行数据包括的字节数量以及对应的一行数据被拆分成的数据分段的数量,根据M个拆分元信息,从N个RAM中并行读取目标页面中的数据,并以数据分段为单位将M行数据中的每行数据被拆分成的数据分段发送到解析模块,可以理解的是,根据M个拆分元信息,将M行数据中的每行数据进行拆分,得到对应的数据分段,每个数据分段被设置为在一个时钟周期上发送到解析模块,通过解析模块从M行数据中获取至少部分列数据,并对至少部分列数据执行目标查询操作,可以理解的是,对至少部分列数据并行地执行查询操作,实现了批量读取多个RAM中存储的数据、批量地读取多行数据的元信息,并批量地确定多行数据的拆分元信息,解析模块批量获取至少部分列数据,进而对获取到的至少部分列数据进行处理,因此,可以解决数据库访问效率较低的问题,达到提升数据库访问效率的效果。
附图说明
图1是根据本申请实施例的一种可选的数据库访问方法的应用场景示意图;
图2是根据本申请实施例的数据库访问方法的流程图;
图3是根据本申请实施例的一种可选的使用FPGA进行数据库异构加速的过程的示意图;
图4是根据本申请实施例中的一种可选的FPGA计算单元的运行示意图;
图5是根据本申请实施例的一种可选的读取对应数据位宽的示意图;
图6是根据本申请实施例的一种可选的并行访问数据的示意图;
图7是根据本申请实施例的一种可选的N个RAM的结构示意图;
图8是根据本申请实施例的一种可选的数据库存储格式的示意图;
图9是根据本申请实施例的一种可选的相关技术中在数据库页面中存储数据的示意图;
图10是根据本申请实施例的一种可选的拆分模块的示意图;
图11是根据本申请实施例的一种可选的拆分模块的拆分流程图一;
图12是根据本申请实施例的一种可选的拆分模块的拆分流程图二;
图13是根据本申请实施例的一种可选的数据库页面的存储格式示意图;
图14是根据本申请实施例的一种可选的并行查询数据库中的数据的示意图;
图15是根据本申请实施例的一种可选的解析子模块的示意图;
图16是根据本申请实施例的一种可选的解析子模块工作的流程示意图;
图17是根据本申请实施例的一种可选的确定列字段位置与长度的示意图;
图18是根据本申请实施例的一种可选的解析结果的示意图;
图19是根据本申请实施例的一种可选的解析示意图;
图20是根据本申请实施例的一种款的过滤模块的结构示意图;
图21是根据本申请实施例的一种可选的编码规则的示意图;
图22是根据本申请实施例的一种可选的并行计算阵列的结构示意图;
图23是根据本申请实施例的一种可选的并行计算阵列的计算的流程图一;
图24是根据本申请实施例的一种可选的计算过程示意图;
图25是根据本申请实施例的一种可选的并行计算阵列的计算的流程图二;
图26是根据本申请实施例的一种可选的并行计算阵列的计算的流程图三;
图27是根据本申请实施例的数据库访问装置的结构框图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本申请的实施例。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
在本实施例中提供了一种数据库访问方法,为了更好地理解本申请实施例中的数据库访问方法的应用场景,下面结合可选的实施例,对本申请实施例中的数据库访问方法的应用场景进行解释和说明,可以但不限于适用于本申请实施例。
图1是根据本申请实施例的一种可选的数据库访问方法的应用场景示意图,如图1所示,在数据库的页面中可以但不限于存储若干行数据,页面中固定位置会标记该页面中所包含的行数量,可以但不限于从页面的顶部开始存储每个行的元信息,在元信息中包含了行在页面中偏移与行的长度,例如,行0的元信息中可以但不限于包括行0的偏移(相当于行0在数据库的页面中的行起始位置)和行0的长度(相当于行0包括的字节数量),行1的元信息中可以但不限于包括行1的偏移(相当于行1在数据库的页面中的行起始位置)和行1的长度(相当于行1包括的字节数量),行2的元信息中可以但不限于包括行2的偏移(相当于行2在数据库的页面中的行起始位置)和行2的长度(相当于行2包括的字节数量),行3的元信息中可以但不限于包括行3的偏移(相当于行3在数据库的页面中的行起始位置)和行3的长度(相当于行3包括的字节数量)。可以但不限于从页面的底部开始存放行数据,可以但不限于先存储行0的数据,然后存储行1的数据,然后存储行2的数据,然后存储行3的数据。
可以但不限于通过4个RAM(或者,5个RAM,或者6个RAM等等,本申请对此不作限制)存储数据库的一个页面中存储的数据,每个RAM的深度可以但不限于均为31,在这样的情况下,可以但不限于从后往前进行存储,例如,RAM1至RAM4的深度31至深度26用于存储数据库的页面中的行0的数据,RAM1至RAM4的深度26至深度15用于存储数据库的页面中的行1的数据,RAM1至RAM4的深度15至深度10用于存储数据库的页面中的行2的数据,RAM1至RAM4的深度10至深度1用于存储数据库的页面中的行3的数据,RAM1至RAM4的深度1至深度0用于存储数据库的页面中各个行的元数据。
可以理解的是,在RAM中存储的数据所对应的逻辑行可以但不限于包括多个列数据,列数据的类型可以但不限于包括整形、日期、字符串以及浮点等等,整形、日期、字符串以及浮点可以但不限于分别通过字段名A、B、C和D进行表示,在这样的情况下,由于整形、日期型与浮点数为定长字段,字符串为变长字段,因此其所对应的长度分别为4、4、-1和8,那么可以计算出各个行的行长度,例如,行0可以但不限于包括1列A、1列B和1列C以及1列D,其行长度为415,行1至行3的行长度的确定方式与行0的行长度的确定方式相同,在此不再赘述。
图2是根据本申请实施例的数据库访问方法的流程图,如图2所示,该流程包括如下步骤:
步骤S202,将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,其中,N为正整数,每个RAM的数据位宽为K个字节,K为2的幂次方;
步骤S204,在所述目标页面包括M行数据的情况下,从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,其中,M为正整数,所述M个元信息中的每个元信息包括所述M行数据中对应的一行数据在所述目标页面中的行起始位置和所述对应的一行数据包括的字节数量,在每个时钟周期上从所述N个RAM中并行读取的数据包括N×K个字节的数据;
步骤S206,根据所述M个元信息,确定M个拆分元信息,其中,所述M个拆分元信息中的每个拆分元信息包括所述M行数据中对应的一行数据在所述N个RAM中的存储起始位置、所述对应的一行数据包括的字节数量以及所述对应的一行数据被拆分成的数据分段的数量;
步骤S208,根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,并以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,其中,在每个时钟周期上从所述N个RAM中并行读取的数据包括所述M行数据中的N×K个字节的数据,每个数据分段被设置为在一个时钟周期上发送到所述解析模块;
步骤S210,通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作。
通过上述步骤,每个RAM的数据位宽为2的幂次方,可以理解的是,在每个时钟周期上可以批量将数据库的数据页面中的2的幂次方的字节写入到N个RAM中,在目标页面包括M行数据的情况下,从N个RAM中读取M行数据中的每行数据的元信息,得到M个元信息,M个元信息中的每个元信息包括M行数据中对应的一行数据在目标页面中的行起始位置和对应的一行数据包括的字节数量,在每个时钟周期上从N个RAM中并行读取的数据包括N×K个字节的数据,可以理解的是,在每个时钟周期上从多个RAM中并行批量地读取多行数据的元信息,根据M个元信息,确定M个拆分元信息,M个拆分元信息中的每个拆分元信息包括M行数据中对应的一行数据在N个RAM中的存储起始位置、对应的一行数据包括的字节数量以及对应的一行数据被拆分成的数据分段的数量,根据M个拆分元信息,从N个RAM中并行读取目标页面中的数据,并以数据分段为单位将M行数据中的每行数据被拆分成的数据分段发送到解析模块,可以理解的是,根据M个拆分元信息,将M行数据中的每行数据进行拆分,得到对应的数据分段,每个数据分段被设置为在一个时钟周期上发送到解析模块,通过解析模块从M行数据中获取至少部分列数据,并对至少部分列数据执行目标查询操作,可以理解的是,对至少部分列数据并行地执行查询操作,实现了批量读取多个RAM中存储的数据、批量地读取多行数据的元信息,并批量地确定多行数据的拆分元信息,解析模块批量获取至少部分列数据,进而对获取到的至少部分列数据进行处理,因此,可以解决数据库访问效率较低的问题,达到提升数据库访问效率的效果。
在上述步骤S202提供的技术方案中,目标数据库中的各个页面的大小可以但不限于相同,可以但不限于将目标数据库的一个页面存储到目标芯片的N个RAM(Random AccessMemory,随机存取存储器)中,可以理解的是,通过一组RAM中的各个RAM共同存储目标数据库的一个页面。
可选的,在本实施例中,目标数据库中存储的数据可以但不限于存储在一个或者多个页面中,目标数据库可以但不限于包括关系型数据库,例如,Mysql、SqlServer等等,目标数据库还可以但不限于包括非关系型数据库等等,本申请对此不作限制。
可选的,在本实施例中,目标芯片可以但不限于包括FPGA(Field ProgrammableGate Array,现场可编程逻辑门阵列)、CPLD(Complex Programmable logic device,复杂可编程逻辑器件)等等芯片,本申请对此不作限制,图3是根据本申请实施例的一种可选的使用FPGA进行数据库异构加速的过程的示意图,如图3所示,可以但不限于包括以下步骤:
步骤101,数据库中的数据由CPU从磁盘中读取到CPU侧内存;
步骤102,通过PCIe(peripheral component interconnect express,一种高速串行计算机扩展总线标准)总线传输到FPGA的片外内存中;
步骤103,FPGA从片外内存中读取数据库数据到片上内存(BRAM(Block RAM,块随机存储器))进行计算;
步骤104,FPGA将计算结果写入到片外DDR(Double Data Rate,双倍速率同步动态随机存储器)中;
步骤105,CPU从通过PCIe总线从FPGA的片外内存中获取计算后的结果。
本申请实施例中的数据库访问的方法可以但不限于应用上述步骤S103和步骤S104中,本申请实施例中的FPGA内计算单元,可以但不限于包括五个模块:读取模块、拆分模块,解析模块、过滤模块、以及回写模块。图4是根据本申请实施例中的一种可选的FPGA计算单元的运行示意图,如图4所示,可以但不限于包括以下步骤:
201,读取模块,将页面数据从FPGA片外内存(DDR)中读取到片上缓存阵列中,传输到拆分模块;
202,拆分模块,根据数据库页面存储格式,从缓存阵列中提取行数据,将行数据传输到解析模块;
203,解析模块,采用多级流水线从行数据中解析出列字段的位置与长度信息,传输到过滤模块;
204,过滤模块,采用缓存阵列缓存不同类型的数据,进行过滤计算,将满足过滤条件的页面ID(Identity document,身份证标识号)与行号,作为结果信息输出到回写模块;
205,回写模块,将缓存计算的结果,批量回写到片外内存(例如,DDR)上。
读取模块、拆分模块,解析模块、过滤模块、以及回写模块组成流水线,流水线之间使用乒乓缓存进行数据的传递,进行数据的流水处理。
在上述读取模块中,FPGA从片外内存中读取数据库数据到片上内存时,一次最大可以从片外DDR(或称为,片外内存)读取512bit(比特)数据。数据存入到片上内存(BRAM)的耗时取决于片上内存的数据位宽。比如片上内存数据位宽为8bit,则需要64个时钟周期;片上内存数据位宽为64bit,则需要8个时钟周期;片上内存的数据位宽为512bit,则只需要一个时钟周期。
虽然越大的片上内存数据位宽,可以在更短的时间内完成数据的存储操作。但从片上缓存读取时,只能一次读取对应数据位宽的数据。无法以更细粒度的位宽直接获取目标数据。图5是根据本申请实施例的一种可选的读取对应数据位宽的示意图,如图5所示,存储16B(Byte,字节)字符串“abcdefghijklnmop”,需要单独访问字符k时,如果使用一个8bit位宽的RAM进行存储,向RAM的地址线输入10(下标从0开始),数据线上即输出8bit目标数据,需要一个时钟周期;如果使用一个32bit位宽的RAM进行存储,则向RAM地址线输入2(下标从0开始),数据线上会输出32bit数据,其中包含了目标字符k,需要再次从32bit中提取字符k,需要两个时钟周期。
当需要访问多个数据时,单个RAM只能串行访问,如果使用RAM阵列可以并行访问多个RAM端口,从而提升访问性能。图6是根据本申请实施例的一种可选的并行访问数据的示意图,如图6所示,存储16B字符串“abcdefghijklnmop”,需要访问字符串“efghijkl”时,如果使用一个8bit位宽的RAM进行存储,需要向RAM地址线依次输入4,5,6,7,8,9,10,11,耗时8个时钟周期;如果使用一个32bit位宽的RAM进行存储,需要向RAM地址线输入1,2,耗时2个时钟周期;如果使用2个32bit位宽的RAM进行存储,可以并行向两个RAM中输入地址:1,0,耗时1个时钟周期。综上可见,在将数据从片外存储器(或称为,片外内存)读取到片上内存时,片上内存的设计对数据的读写性能有很大影响。
在一个示范性实施例中,可以但不限于通过以下方式将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM:在每个时钟周期上将所述目标页面中的K个字节的数据写入到所述N个RAM中的一个RAM中,其中,所述目标数据库是所述目标芯片的片外内存中存储的数据库,所述N个RAM按时钟周期被依次写入所述目标页面中的K个字节的数据。
可选的,在本实施例中,N个RAM按时钟周期被依次写入目标页面中的K个字节的数据,可以理解的是,在第一个时钟周期,将目标页面中的K个字节的数据写入到N个RAM中的第一个RAM,在第二个时钟周期,可以但不限将目标页面中的K个字节的数据写入到N个RAM中的第二个RAM,在第三个时钟周期,可以但不限将目标页面中的K个字节的数据写入到N个RAM中的第三个RAM,其中,K为2的幂次方。
例如,以N等于4为例,即N个RAM包括RAM1至RAM4,在第一个时钟周期,将目标页面中的K个字节的数据写入到RAM1,在第二个时钟周期,可以但不限将目标页面中的K个字节的数据写入到RAM2,在第三个时钟周期,可以但不限将目标页面中的K个字节的数据写入到RAM3,在第四个时钟周期,可以但不限将目标页面中的K个字节的数据写入到RAM4。
在一个示范性实施例中,可以但不限于通过以下方式将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM:在第i个时钟周期上,当j不等于0时,将所述目标页面中的第i组数据写入所述N个RAM中的第j个RAM中,当j等于0时,将所述第i组数据写入所述N个RAM中的第N个RAM中,其中,所述第i组数据包括K个字节的数据,i为正整数,j为将i除以N所得的余数,j为正整数。
可选的,在本实施例中,在一个时钟周期上可以但不限于将目标页面中的一组数据写入到N个RAM中的一个RAM中,其中,一组数据包括K个字节的数据,例如,N=4,即N个RAM包括RAM1至RAM4。
那么,在这样的情况下,在第1个时钟周期上,将第1组数据写入到RAM1中,在第2个时钟周期上,将第2组数据写入到RAM2中,在第3个时钟周期上,将第3组数据写入到RAM3中,在第4个时钟周期上,将第4组数据写入到RAM4中,在第5个时钟周期上,将第5组数据写入到RAM5中,在第6个时钟周期上,将第6组数据写入到RAM1中。
在一个示范性实施例中,可以但不限于通过以下方式确定N:在所述目标数据库或所述目标页面包括多行数据的情况下,N是根据所述多行数据中的每行数据包括的字节数量与所述每个RAM的数据位宽所确定得到的值。
可选的,在本实施例中,N可以但不限于根据目标数据库中的所有页面中的每行数据包括的字节数据与每个RAM的数据位宽所确定得到的值,或者N可以但不限于根据目标数据库中的目标页面中的每行数据包括的字节数据与每个RAM的数据位宽所确定得到的值。
可选的,在本实施例中,每个RAM的数据位宽可以但不限于相同,图7是根据本申请实施例的一种可选的N个RAM的结构示意图,如图7所示,可以但不限于以数据库页面包括PostgreSQL页面为例,在PostgreSQL页面中存储有行数、行0元信息(可以但不限于包括行0的偏移、行0的长度)、行1的元信息(可以但不限于包括行1的偏移、行1的长度),以及行0的数据、行1的数据等等,例如,在行0的数据中可以但不限于包括列0至列5的数据。
RAM阵列301可以但不限于用于表示读取模块中包括的RAM阵列,RAM阵列可以但不限于包括多个RAM组,例如,RAM阵列301中可以但不限于包括RAM组0至RAM组N1,RAM302可以但不限于用于表示每个RAM组中,包括多个相同数据位宽,相同深度的RAM,例如,RAM组2中可以但不限于包括RAM0至RAMN1。数据库页面303用于表示一个RAM组中用于存储目标数据库的一个页面。例如,可以但不限于将PostgreSQL页面中存储的数据存储至RAM组2中的各个RAM中。
在一个示范性实施例中,N为对目标比值进行向上取整所得到的值,其中,所述目标比值是将目标行长度除以K所得到的比值,所述目标行长度是所述多行数据中的每行数据包括的字节数量的均值,或者,是所述多行数据中的每行数据包括的字节数量中出现次数最多的字节数量。
可选的,在本实施例中,可以但不限于通过以下方式确定N:使用数据库中待查询数据样本的平均行长度(相当于目标行长度)除以最大数据位宽(相当于每个RAM的数据位宽)/>,/>,其中,相当于目标比值,/>向上取整后作为一个RAM组中RAM的个数,得到N。RAM组中RAM个数N乘以RAM位宽/>,作为最大并发读取长度
例如,数据库中待查询数据的平均行长度(相当于目标行长度)为255B,RAM最大位宽为512bit,那么一个RAM组中的RAM个数为255/64=3.98(相当于目标比值),向上取整后为4,即一个RAM组中有4个512bit位宽的RAM;最大并发读取长度为4*64 = 256B。
相较于相关技术中并不关注所查询数据的行长度信息。简单的将所有数据存放在一个RAM中,FPGA的逻辑设计并未与数据长度分布进行优化匹配。而通过本申请实施例中的方式,使用待查询数据行长度的均值作为基准,设定RAM的个数,对于页面内大部分数据,最多只需要2个时钟周期,即可获取全部目标行数据。大幅降低了对RAM组进行数据提取时随机访问所需的时间开销。
在一个示范性实施例中,K是所述目标芯片的内部总线所允许读写的最大数据位宽。
可选的,在本实施例中,K可以但不限于用于表示在一个时钟周期上目标芯片的内部总线所允许的对一个RAM中的数据进行访问的最大字节数。例如,在目标芯片包括FPGA的情况下,可以但不限于使用FPGA的内部总线所支持的最大BRAM位宽作为BRAM的数据位宽,一次性读取最大位宽长度数据。
例如,在VU37P型号的FPGA上最大支持512bit RAM位宽,那么可以但不限于将片上内存(BRAM)中的各个RAM的数据位宽设置为512bit,一次性读写64B数据。
可选的,在本实施例中,还可以但不限于通过以下方式确定每个RAM的深度:将目标数据库中的目标页面的页面大小除以最大并发读取长度,作为每个RAM的深度,也就是说,。其中,/>为目标数据库中的目标页面的页面大小,/>为最大并发读取长度,/>为每个RAM的深度。
例如,RAM最大位宽512bit,RAM组中RAM个数为4,对于PostgreSQL数据库,其页面大小为8KB,因此RAM存储深度为8KB/(64*4)=32,即每个RAM组存储8KB数据,每个组中有4个RAM,每个RAM的位宽为512bit,深度为32,能够存放2KB数据。对于MySQL数据库,其页面大小为32KB,RAM存储深度为32KB/(64*4)=128,即每个RAM组存储32KB数据,每个组有4个RAM,每个RAM的位宽为512bit,深度为128,能够存放8KB数据。
在一个示范性实施例中,可以但不限于通过以下方式从所述N个RAM中并行读取所述目标页面中的数据,包括:在将所述目标页面中的全部数据写入到所述N个RAM之后,从所述N个RAM中并行读取所述目标页面中的数据。
可选的,在本实施例中,可以但不限于在将目标页面中的全部数据写入到N个RAM之后,从N个RAM中并行读取目标页面中的数据,可以理解的是,先将目标页面中的数据全部写入至N个RAM中,再从N个RAM中读取目标页面中的数据。
在一个示范性实施例中,可以但不限于通过以下方式将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM:在所述目标芯片中具有多个RAM组的情况下,将所述目标页面中的数据写入到所述目标芯片中的第一RAM组中的所述N个RAM,其中,所述多个RAM组中的每个RAM组中包括的RAM的数量均为N;所述根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,包括:根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述目标页面中的数据;所述方法还包括:在所述目标数据库包括一组页面、且所述目标页面是所述一组页面中的第一页面的情况下,在根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述第一页面中的数据的过程中,将所述目标数据库中的第二页面中的数据写入到所述多个RAM组中的第二RAM组包括的N个RAM。
可选的,在本实施例中,目标数据库中的各个页面可以但不限于对应于多个RAM组中的一组RAM中,多个RAM组中的各组RAM均包括N个RAM,可以理解的是,目标数据库中的一个页面被写入到多个RAM组中的一组RAM中。
可选的,在本实施例中,在目标数据库包括一组页面、且目标页面是一组页面中的第一页面的情况下,根据M个拆分元信息,从第一RAM组中包括的所述N个RAM中并行读取第一页面中的数据的操作,与将目标数据库中的第二页面中的数据写入到多个RAM组中的第二RAM组包括的N个RAM的操作之间是异步执行的操作。
在一个示范性实施例中,在所述多个RAM组为U个RAM组,U是将第一时长除以第二时长所得到的比值,其中,所述第一时长用于表示所述解析模块解析所述目标数据库中的一个页面所需的平均时长,所述第二时长是将W除以K所得到的比值,W表示所述目标数据库中的一个页面中包括的平均字节数量,W为正整数。
可选的,在本实施例中,每个RAM组中包括的RAM的数量均为N,一个RAM阵列中可以但不限于包括多个RAM组,多个RAM组存放目标数据库的多个页面,可以但不限于通过以下方式确定一个RAM阵列中包括的RAM组的数量:,其中,/>为一个RAM阵列中包括的RAM组的数量,/>为解析模块解析目标数据库的一个页面的耗时,/>为一个RAM组填充数据的耗时。通过这样的方式,使得读取模块耗时与解析模块耗时一致,减少流水线上等待时间,提升整体吞吐率。
例如:PostgreSQL数据库页面大小为8KB,FPGA RAM位宽为512bit(64B),一个RAM组中包含了4个RAM,深度为32,可存储8KB(相当于W=8KB)的页面数据,K=64B,由于数据从外部内存到片上RAM的写入过程是串行的,因此耗时8KB/64B=128个时钟周期。假设解析模块完成一个页面的解析时间=1024个时钟周期,则一个RAM阵列中包含1024/128=8个RAM组,相当于U=8。完成个RAM阵列的填充时间与解析模块完成一个页面的解析时间一致。
为了更好的理解本申请实施例中的确定N个RAM中每个RAM的数据位宽、以及确定N的过程,下面结合可选的实施例,对本申请实施例中的数据库访问方法进行解释和说明,可以但不限于适用于本申请实施例。
以目标数据库包括PostgreSQL数据库为例,数据库中一个8KB为单位作为一个页面,页面中存储行数据。FPGA使用VU37P芯片,最大支持512bit RAM位宽。数据库中行长度的平均值可以但不限于为256B,解析模块完成一个页面的解析耗时为1024个时钟周期。则读取模块中,缓存阵列(或称为一个RAM阵列)设置为8个RAM组,每个RAM组中包含4个RAM,每个RAM的位宽为512bit,深度为32。一个RAM阵列存储8个8KB页面,共计64KB数据。
在数据写入时,以512bit位宽,顺序向每个RAM中填充数据,完成一个RAM组填充耗时128个时钟周期,完成一个RAM阵列填充耗时1024个时钟周期。
值得注意的是,下一级模块在读取数据时,可以对每个RAM进行并行读取,例如一个RAM组中有4个RAM,可以一次读取256B字节,耗时32个时钟周期。一个RAM阵列的读取耗时为32个时钟周期。由于下一级读取耗时远小于写入耗时,剩余的时钟周期可以用于下一级模块的逻辑处理。
相较于现有技术中,为了便于页面解析的逻辑处理,将所有数据存放在一个RAM中,位宽设置为1B,需要逐个字节的读取页面数据,读取效率极低。因此仅读取过程的耗时就为8192个时钟周期。而通过本申请实施例中的方式,使用长位宽进行数据的写入与读取,同时在一个RAM组中包含多个RAM可以并行读取数据,大幅提升了数据的读写效率。同样对于8KB页面,假设使用512bit位宽进行数据的写入操作,一个RAM组中使用4个RAM,完成8KB页面填充只需要128个时钟周期,进行读取时只需要32个时钟周期。
另外,相关技术中,并不考虑与后续模块的处理速度匹配问题,容易造成流水线数据的阻塞等待。而通过本申请实施例中的方式,提出使用多个RAM组与后续模块进行处理速度的匹配的设计方法,提升了数据处理流水线的吞吐率。
需要说明的是,本申请实施例的读取模块中,使用平均行长度作为最大并行长度,在实际应用中可以进一步优化,由于行长度的分布可能并不均匀,例如有一百个行,其中90个行长为100,其余10个行长为10000,均值被少数长的行拉大了,更为合理的做法是统计最高频率出现的行长范围,作为最大并行长度。
在上述步骤S204提供的技术方案中,在每个时钟周期上从N个RAM中并行读取的数据包括N×K个字节的数据,例如,在第一个时钟周期上,从N个RAM中的每个RAM中并行读取K个字节的数据,在第二个时钟周期上,从N个RAM中的每个RAM中并行读取K个字节的数据,在第三个时钟周期上,从N个RAM中的每个RAM中并行读取K个字节的数据。
可选的,在本实施例中,M个元信息中的每个元信息包括M行数据中对应的一行数据在目标页面中的行起始位置和对应的一行数据包括的字节数量,一行数据在目标页面中的行起始位置可以但不限于包括该行数据在目标页面中的偏移位置,目标页面为8KB,目标页面中的首行数据(例如,行0)包括的字节数量为20B那么行0的行起始位置等于8KB减去20B。
传统数据库中以行存储模式,存放用户输入的行记录,每一行中包含了一到多个列。在数据库中通常以固定大小的页面存放行记录,在页面中存放该页面内的行个数以及行数据在页面内的偏移与长度。以PostgreSQL数据库为例,图8是根据本申请实施例的一种可选的数据库存储格式的示意图,如图8所示,PostgreSQL数据库以8KB为单位,进行数据表的存储。每一个8KB页面中存储若干行数据,页面中固定位置会标记该页面中所包含的行数量。从页面的顶部开始存储每个行的元信息(4B),在元信息中包含了行在页面中偏移与行的长度。从页面的底部开始存放行数据,一行中包含了多个列数据。由于存在变长数据,因此每一行的长度不同。
相关技术中,使用1B位宽的RAM存放目标数据。图9是根据本申请实施例的一种可选的相关技术中在数据库页面中存储数据的示意图,如图9所示,先从页面中读取行数量;之后遍历每个行的元信息,从元信息中获取每一行在页面中的起始位置与长度;从行中解析提取目标列。由于每次只能访问一个字节,因此需要较多的时钟周期完成全部数据的获取。
本申请实施例中读取模块对数据的使用多个长位宽的RAM进行存储,虽然一次性可以操作大量数据,提升了数据的写入与读取性能,但同时带来了数据对齐与冗余的问题,给数据的解析带来了挑战。
为了解决该问题,本申请实施例中引入了拆分模块。在拆分模块中,计算出页面中行数据所使用到的RAM空间,从RAM组中,提取行数据分段发送到解析模块中。并给出有效数据,在码流中的偏移与长度,送入到解析模块中。拆分模块可以但不限于用于按照数据库页面的格式,从页面中提取行数据,对行数据进行拆分,送入到解析模块中。拆分模块,可以但不限于解析页面中行数据个数,行数据在页面中的偏移与长度,以拆分长度为单位,一次并行读取多个长位宽数据,传输到解析模块中,同时传入拆分的段号。
图10是根据本申请实施例的一种可选的拆分模块的示意图,如图10所示,拆分模块可以但不限于包括RAM选择器401、页面数据输入端口402、拆分控制逻辑403、行数据输出端口404和行拆分元信息输出端口405。
RAM选择器401,连接到读取模块的RAM阵列上,从RAM阵列中轮询获取RAM组中的数据,完成一个RAM组中数据读取后,切换到下一个RAM组。
页面数据输入端口402,从RAM组中获取数据,数据位宽总长度为最大并发读取长度。一次从RAM组中获取各个RAM中指定偏移位置的数据。
拆分控制逻辑403,对页面中的行数据进行拆分,当页面中行数据小于最大并发读取长度时,剩余数据使用0填充,元信息端口中标记段数量为1;当页面中的行数据大于最大并发读取长度时,以拆分长度为单位将行数据拆分为多个段,不同段使用段号进行标记,并标记总的段数量,拆分段之间间隔T个时钟周期送入到解析模块,T等于解析模块中流水线级数。
行数据输出端口404,数据位宽等于最大并发读取长度连接到解析模块中,输出页面中的行数据。
行拆分元信息输出端口405,数据位宽等于最大并发读取长度,每一行数据会有一个到多个元信息输出,包含了对行数据的拆分段数量、段号、以及行有效数据在行数据端口中的偏移与长度。
在一个示范性实施例中,可以但不限于通过以下方式从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息:从所述N个RAM中并行读取第一组数据,并从所述第一组数据中获取目标行数,其中,所述第一组数据是所述目标页面中的N×K个字节的数据,所述第一组数据包括所述目标行数,所述目标行数等于M,所述目标行数用于指示所述目标页面中包括的数据的行数为M;在所述第一组数据不包括所述M个元信息的情况下,根据所述目标行数,从所述N个RAM中获取所述M个元信息;在所述第一组数据包括所述M个元信息中的P个元信息的情况下,从所述第一组数据中获取所述P个元信息,并根据所述目标行数,从所述N个RAM中获取所述M个元信息中除所述P个元信息之外的M-P个元信息,其中,P为小于M的正整数。
可选的,在本实施例中,M个元信息可以但不限于按照预设的格式固定存储在目标数据库的页面中的位置上,例如,M个元信息存储在目标数据库的页面的顶部,或者M个元信息存储在目标数据库的页面的底部等等,在这样的情况下,可能读取到的第一组数据中并不包括M个元信息中的任意一个元信息,在这样的情况下,可以但不限于根据目标行数M,从N个RAM中获取M个元信息。
可选的,在本实施例中,可能读取到的第一组数据中包括M个元信息中的部分元信息(例如,P个元信息),在这样的情况下,可以但不限于根据目标行数M,从N个RAM中获取M个元信息中还未获取到的元信息(例如,M-P个元信息)。
可选的,在本实施例中,在第一组数据包括M个元信息的情况下,读取第一组数据中包括的M个元信息。
在一个示范性实施例中,可以但不限于通过以下方式根据所述目标行数,从所述N个RAM中获取所述M个元信息:在所述M个元信息中的每个元信息包括R个字节的数据、且M×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M个元信息。
可选的,在本实施例中,在M个元信息中的每个元信息包括R个字节的数据、且M×R大于N×K的情况下,从N个RAM中并行读取第三组数据,并从第三组数据中获取M个元信息中的S个元信息,其中,第三组数据是所述目标页面中的N×K个字节的数据,所述第三组数据包括S个元信息,S为小于M的正整数,在M个元信息中的每个元信息包括R个字节的数据、且(M-S)×R小于或者等于N×K的情况下,从N个RAM中并行读取第四组数据,并从第四组数据中获取(M-S)个元信息,其中,第四组数据是目标页面中的N×K个字节的数据,第四组数据包括(M-S)个元信息。
在一个示范性实施例中,可以但不限于通过以下方式根据目标行数,从N个RAM中获取所述M个元信息中除所述P个元信息之外的M-P个元信息:在所述M个元信息中的每个元信息包括R个字节的数据、且(M-P)×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M-P个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M-P个元信息。
可选的,在本实施例中,在M个元信息中的每个元信息包括R个字节的数据、且(M-P)×R小于或等于N×K的情况下,可以实现一次性的将M个元信息中的M-P个元信息并行读取出来。
在上述步骤S206提供的技术方案中,M个拆分元信息中的各个拆分元信息包括M行数据中对应的一行数据在N个RAM中的存储起始位置、对应的一行数据包括的字节数量以及对应的一行数据被拆分成的数据分段的数量,其中,M行数据中对应的一行数据在N个RAM中的存储起始位置可以但不限于包括在N个RAM中的起始深度。
在一个示范性实施例中,可以但不限于通过以下步骤根据所述M个元信息中的第m个元信息,确定所述M个拆分元信息中的第m个拆分元信息,其中,m为小于或等于M的正整数,所述第m个元信息包括第m个行起始位置和第m个字节数量,所述第m个行起始位置用于表示所述M行数据中的第m行数据在所述目标页面中的行起始位置,所述第m个字节数量用于表示所述第m行数据包括的字节数量:根据所述第m个行起始位置和所述第m个字节数量,确定所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址;根据所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,确定第m个数量,其中,所述第m个数量用于表示所述第m行数据被拆分成的数据分段的数量;根据所述第m个字节数量,确定所述第m行数据在所述N个RAM中的第m个存储起始位置;将所述第m个拆分元信息确定为包括所述第m个存储起始位置、所述第m个字节数量和所述第m个数量。
可选的,在本实施例中,第m行数据在N个RAM中的起始存储地址可以但不限于用于表示第m行数据在N个RAM中的起始深度,第m行数据在N个RAM中的结束存储地址可以但不限于用于表示第m行数据在N个RAM中的结束深度。第m行数据在N个RAM中的起始深度和第m行数据在N个RAM中的结束深度可以但不限于相同或者不同等等。
例如,N个RAM中的每个RAM的深度可以但不限于均为32,在这样的情况下,第m行数据在N个RAM中的起始存储地址可以但不限于用于表示深度31,第m行数据在N个RAM中的结束存储地址可以但不限于用于表示深度30;或者,第m行数据在N个RAM中的结束存储地址可以但不限于用于表示深度31。
在一个示范性实施例中,所述第m个拆分元信息包括:第m个行发送间隔计数值,其中,所述第m个行发送间隔计数值用于在第m行数据被拆分成的数据分段的数量大于或者等于2的情况下,所述第m行数据的相邻两个数据分段被发送至所述解析模块之间所间隔的时钟周期,或者在所述第m行数据被拆分成的数据分段的数量为1的情况下,所述第m行数据与所述第m行数据的下一行数据的数据分段被发送至所述解析模块之间所间隔的时钟周期。
可选的,在本实施例中,第m个行发送间隔计数值可以但不限于用于表示T个是在第m行数据被拆分成的数据分段的数量大于或者等于2的情况下,在将第m行数据的第一个数据分段发送至解析模块的情况下,间隔第m个行发送间隔计数值所表示的T个时钟周期,再次将第m行数据的第二个数据分段发送至解析模块。
可选的,在本实施例中,在第m行数据被拆分成的数据分段的数量为1、在时钟周期T1上将第m行数据发送至解析模块、且在时钟周期T2上将第m行数据的下一行数据的第一个数据分段发送至解析模块的情况下,在从时钟周期T2开始的T-1个时钟周期上向解析模块发送空数据,在第(T2+T-1)个时钟周期上,将第m行数据的下一行数据的第二个数据分段发送至解析模块。
在一个示范性实施例中,可以但不限于通过以下方式根据第m个行起始位置和第m个字节数量,确定第m行数据在所述N个RAM中的起始存储地址和结束存储地址:在所述第m个行起始位置包括所述目标页面中的第Qm个字节的情况下,将所述第m行数据在所述N个RAM中的起始存储地址确定为对Qm/K进行向下取整所得到的值,并将所述第m行数据在所述N个RAM中的结束存储地址确定为对(Qm+所述第m个字节数量)/K进行向上取整所得到的值,其中,Qm为正整数。
可选的,在本实施例中,第m个行起始位置包括目标页面中的第Qm个字节,例如,目标页面的大小为8K,可以但不限于从目标页面的底部开始存储行数据,在这样的情况下,第m行起始位置为352,其中,可以理解的是,第m行起始位置可以但不限于包括目标页面第352个字节。
在一个示范性实施例中,可以但不限于通过以下方式根据第m行数据在N个RAM中的起始存储地址和结束存储地址,确定所述第m行数据被拆分成的数据分段的第m个数量:在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的同一行的情况下,将所述第m个数量确定为等于1;在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的不同行的情况下,将所述第m个数量确定为等于(|A-B|+1),其中,所述起始存储地址表示所述N个RAM中的第A行,所述结束存储地址表示所述N个RAM中的第B行,A和B为正整数,A和B不相同。
可选的,在本实施例中,在第m行数据在N个RAM中的起始存储地址和结束存储地址表示N个RAM中的同一行的情况下,可以理解的是,第m行数据在N个RAM中的起始深度和结束深度相同,在这样的情况下,可以但不限于将第m行数据划分为一段。
例如,N个RAM中的每个RAM的深度可以但不限于均为32,在这样的情况下,第m行数据在N个RAM中的起始存储地址可以但不限于用于表示深度31,第m行数据在N个RAM中的结束存储地址可以但不限于用于表示深度31,那么,可以但不限于将第m行数据中的所有数据划分为一段,即不对第m行数据进行拆分。
可选的,在本实施例中,在第m行数据在N个RAM中的起始存储地址和结束存储地址表示N个RAM中的不同行的情况下,可以理解的是,第m行数据在N个RAM中的起始深度和结束深度不同,在这样的情况下,可以但不限于将第m行数据划分为(|A-B|+1)段。
例如,N个RAM中的每个RAM的深度可以但不限于均为32,在这样的情况下,第m行数据在N个RAM中的起始存储地址可以但不限于用于表示深度30,第m行数据在N个RAM中的结束存储地址可以但不限于用于表示深度19,那么,可以但不限于将第m行数据中的所有数据划分为(|19-30|+1),即将第m行数据拆分为2段。
可选的,在本实施例中,在将第m行数据拆分为多个数据分段的情况下,每个数据分段所包括的字节数可以但不限于不同或者相同,例如,N个RAM包括RAM1至RAM4,RAM1至RAM4的数据位宽均为64B,RAM1至RAM4的深度均为32,第m行数据包括356B,第m行数据在N个RAM中的起始存储地址可以但不限于用于表示深度30,第m行数据在N个RAM中的结束存储地址可以但不限于用于表示深度31,那么,可以但不限于将第m行数据拆分为数据分段1和数据分段2,假设第m行数据是首个存储在目标数据库的页面中的数据,那么数据分段1包括的字节数为256B,数据分段1包括的字节数为100B。
在一个示范性实施例中,根据所述第m个字节数量,确定所述第m行数据在所述N个RAM中的第m个存储起始位置可以但不限于包括以下方式之一:
方式一,在m等于1、且所述第m个字节数量小于或等于N×K的情况下,将所述第m个存储起始位置确定为(N×K-所述第m个字节数量+1)。
可选的,在本实施例中,在m等于1、且第m个字节数量小于或等于N×K的情况下,可以理解的是,第m行数据是目标数据库的目标页面中存储的首行数据,可以理解的是,第m行数据被存储在N个RAM中的首行,在这样的情况下,可以但不限于将第m个存储起始位置确定为(N×K-所述第m个字节数量+1)。
例如,N个RAM包括RAM1至RAM4,RAM1至RAM4的数据位宽均为64B,第m个字节数量为150,那么,可以但不限将第m个存储起始位置确定为4×64-150+1=107。
方式二,在m等于1、且所述第m个字节数量大于N×K的情况下,将所述第m个存储起始位置确定为(N×K-第m个余数+1),其中,所述第m个余数等于将所述第m个字节数量除以(N×K)所得到的余数。
可选的,在本实施例中,在m等于1、且第m个字节数量大于N×K的情况下,第m行数据是从目标数据库的目标页面中的首行开始存储的数据,且第m行数据存储在目标数据库的目标页面中的多行中,可以理解的是,从N个RAM中的首行开始的多行用于存储第m行数据。
例如,N个RAM包括RAM1至RAM4,RAM1至RAM4的数据位宽均为64B,第m个字节数量为356,那么,可以但不限将第m个存储起始位置确定为4×64-100+1=157,其中,第m个余数等于356/(4×64)所得到的余数,即第m个余数为100。
方式三,在m大于1、且所述第m个字节数量小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个字节数量),其中,所述第m-1个存储起始位置是所述M行数据中的第m-1行数据在所述N个RAM中的存储起始位置。
可选的,在本实施例中,在m大于1、且第m个字节数量小于或等于(第m-1个存储起始位置-1)的情况下,可以理解的是,第m行数据和第m-1行数据均存储在N个RAM中的同一行。
例如,N个RAM包括RAM1至RAM4,RAM1至RAM4的数据位宽均为64B,第m行数据包括50B,即,第m个字节数量为50,在这样的情况下,将第m个存储起始位置确定为(162-50)=112。
方式四,在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个余数)。
例如,N个RAM包括RAM1至RAM4,RAM1至RAM4的数据位宽均为64B,第m行数据包括272B,即,第m个字节数量为272,第m-1个存储起始位置为156,在这样的情况下,第m个余数等于272/256所得到的余数,即第m个余数等于16,那么,可以但不限于将第m个存储起始位置确定为(156-16)=140。
方式五,在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数大于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(N×K-(所述第m个余数-所述第m-1个存储起始位置))。
例如,N个RAM包括RAM1至RAM4,RAM1至RAM4的数据位宽均为64B,第m行数据包括150B,即,第m个字节数量为150,第m-1个存储起始位置为112,那么第m个余数等于150,在这样的情况下,将m个存储起始位置确定为4×64-(150-112)=194。
在上述步骤S208提供的技术方案中,可以但不限于通过以下方式根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据:通过执行以下步骤,根据所述M个拆分元信息中的第r个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据:并行读取N个RAM中的各个RAM在存储起始位置上所存储的数据,其中,第r个拆分元信息是M行数据中第r行数据的拆分元信息,第r个拆分元信息包括第r行数据在N个RAM中的存储起始位置、第r行数据包括的字节数量以及第r行数据被拆分成的数据分段的数量。
在一个示范性实施例中,可以但不限于通过以下方式所述以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块:在所述M行数据中的一行数据被拆分成多个数据分段的情况下,所述多个数据分段中的相邻两个数据分段间隔T个时钟周期被发送到所述解析模块,其中,T为大于或等于2的正整数,T等于所述解析模块中流水线级数。
可选的,在本实施例中,T等于解析模块中流水线级数,可以理解的是,T等于解析模块中包括的按照流水线方式工作的列解析单元的数量。
可选的,在本实施例中,可以但不限于通过以下方式将多个数据分段中的相邻两个数据分段间隔T个时钟周期被发送到解析模块:在第一个时钟周期上,将多个数据分段中的第1个数据分段发送至解析模块,其中,第1个数据分段的行发送间隔计数值为预设值,行发送间隔计数值为预设值的数据分块被设置为允许发送至解析模块,多个数据分段中行发送间隔计数值不为预设值的数据分块被设置为不允许发送至解析模块;在第二个时钟周期上,将多个数据分段中的第2个数据分段的行发送间隔计数值设置为预设值,并将第2个数据分段发送至解析模块,并将第1个数据分段的行发送间隔计数值确定为预设值加1;在第三个时钟周期上,将多个数据分段中的第3个数据分段的行发送间隔计数值设置为预设值,并将第3个数据分段发送至解析模块,并将第1个数据分段的行发送间隔计数值确定为预设值加1加1,并将第2个数据分段的行发送间隔计数值确定为预设值+1,...,在第T+1个时钟周期上,将多个数据分段中的第T+1个数据分段的行发送间隔计数值设置为预设值,并将第T+1个数据分段发送至解析模块,并将发送间隔计数值不等于预设的发送间隔计数值加1;其中,第T+1个数据分段和第1个数据分段是同一行数据的数据分段,第1个数据分段、第2个数据分段、第3个数据分段是不同行数据的数据分段。
为了更好的理解本申请实施例中的拆分模块的操作过程,下面结合可选的实施例,对本申请实施例中的拆分模块的拆分过程进行解释和说明,可以但不限于适用于本申请实施例。
图11是根据本申请实施例的一种可选的拆分模块的拆分流程图一,如图11所示,可以但不限于包括以下步骤:
步骤501,从读取模块中读取页面中包括的行个数,并暂存部分行元信息。
步骤502,读取剩余行元信息并暂存。
步骤503,遍历行元信息。
步骤504,计算逻辑行需要读取的RAM地址范围。方法为:将行起始位置,按照最大数据位宽(相当于最大RAM数据位宽)向下取整,得到行在N个RAM中的起始存储地址,行起始位置加上行长度,按最大数据位宽向上取整,得到该行在N个RAM中的结束存储地址。
步骤505,计算逻辑行需要向RAM组发出的地址范围。方法为:将RAM地址的范围的起始位置与结束位置分别,按照最大并发读取长度进行向下取整与向上取整。
步骤506,设置拆分元信息数组,添加行元信息遍历计数值。拆分元信息数组可以但不限于包括:
[1].行元信息遍历计数值,其值等于行需要向RAM组发出地址的个数。
[2].行发送间隔计数值,初始化为-1。
[3].需要向RAM组发出的地址范围。
[4].行有效数据,在RAM组中的起始位置与长度。
需要说明的是,一行对应一个拆分元信息。
步骤507,执行步骤503,直到全部元信息遍历完成。
步骤508,遍历拆分元信息数组。方法为:如果行元信息遍历计数值大于1,执行步骤509),否则跳过该拆分元信息,执行步骤508)。
步骤509,输出行拆分元信息,将当前行发送间隔计数值清0。方法为:向行拆分元信息中输出拆分段数量,拆分段编号,解析起始偏移(有效数据起始位置,相当于元信息中的行起始位置),有效数据长度(相当于元信息中的行数据包括的字节数量)。
步骤510,从RAM组中拷贝行数据到行数据端口。方法为:根据拆分元信息,向RAM组中发出下一个地址,获取数据长度为最大并发读取长度的数据,将获取的数据,发送至行数据端口。需要说明的是:如果行数据长度大于最大并发读取长度,行数据会被拆分为多个段,相邻段间隔N个时钟周期后发送,N等于解析模块中流水线级数。拆分元信息中存放了每个行的发送间隔计数值,当值为-1时,表示第一个分段可直接发送。当值不等于-1时,如果发送该分段时,时间间隔不足N个时钟周期,则向行数据端口发送空数据,直到间隔时钟周期大于等于N个时钟周期。
步骤511,更新遍历计数值与发送间隔计数值。方法为:将当前拆分元信息的遍历计数值减1,将当前拆分元信息的发送间隔值设置为0,将所有拆分元信息行发送间隔计数值不等于-1的值加1。
步骤512,执行步骤508直到全部拆分元信息遍历完成。
例如,可以但不限于以PostgreSQL数据库为例进行说明,PostgreSQL数据库以8KB为单位进行行数据的存储,解析模块中流水线深度可以但不限于为4,行长度的均值为256B,FPGA最大RAM位宽为512bit(64B)。因此在读取模块中一个RAM组中有4个RAM,每个RAM一次可以读取64B数据,4个RAM一次最大并行读取数量为256B,RAM的深度为32,存储8192B页面数据。
图12是根据本申请实施例的一种可选的拆分模块的拆分流程图二,如图12所示,假设某个页面中存储了3行数据:行0,行1,行2。行0长度为350B,行1长度为50B,行2长度为150B。那么物理存储中会将逻辑页面上的数据,分别存放在4个RAM(如RAM1至RAM4)中。那么,在拆分模块中,可以但不限于包括以下步骤:
1)并行读取4个RAM组的第一行,获取得到该逻辑页面中行个数。由于一次读取了256B数据,里面不仅包含了行个数,还可能包含了部分的行元信息,因此将部分元信息缓存。
2)经过步骤1)知道行个数后,由于元信息长度是固定4B,计算出行元信息占的RAM空间范围,将剩余的元信息从RAM组中读取并缓存。
3)遍历每一行的元信息。
4)计算逻辑行需要读取的RAM地址范围。例如:
[1] 行0,起始地址向下取整后为RAM2的地址30,结束地址向上取整为RAM3的地址31。
[2] 行1,起始地址向下取整后为RAM1的地址30,结束地址向上取整为RAM2的地址30。
[3] 行2,起始地址向下取整后为RAM3的地址29,结束地址向上取整为RAM1的地址30。
5)计算逻辑行需要向RAM组发出的地址范围。例如:
[1] 行0,发送地址30,31。
[2] 行1,发送地址30。
[3] 行2,发送地址29,30。
6)设置拆分元信息数组。每一行对应如下信息:
[1].行元信息遍历计数值,值为需要向RAM发送的地址个数:行0等于2,行1等于1,行2等于2,其中,0-1表示行0的第一个数据分段。行0会被拆分为:0-1和0-2两个数据分段;行拆分为:1-1;行2拆分为:2-1和2-2两个数据分段,其中,0-2表示行0的第2个数据分段。
[2].行发送间隔计数值,初始化为-1。
[3].需要向RAM组发出的地址范围。行0:30,31;行1:30;行2:29,30。
[4].行有效数据,在RAM组中的起始位置与长度。行0:长度等于350,位置等于256-(350-256)=162;行1:长度等于50,位置等于162-50=112;行2:长度等于150,位置等于256-(150-112)=198。
7)执行步骤3)直到全部元信息遍历完成,生成拆分元信息。
8)遍历拆分元信息数组。只处理遍历计数值大于1的拆分元信息。
9)将拆分元信息,输出到行拆分元信息端口中,并清空当前行发送间隔计数值。
10)从RAM组中拷贝行数据到行数据端口。一次拷贝4个RAM组中的256B数据到行数据端口。有效行数据的发送顺序为0-1,1-1,2-1,0-2,2-2,其中,在第二次遍历时,发送0-2时需要插入1个空数据,发送2-2时需要插入1个空数据,可以理解的是,在发送0-2之前,需要耗费一个时钟周期发送一个空数据,在发送2-2之前,需要发送耗费一个时钟周期发送一个空数据。
11)更新遍历计数值与发送间隔计数值。将当前拆分元信息的遍历计数值减1,将当前拆分元信息的发送间隔值设置为0,将所有拆分元信息行发送间隔计数值不等于-1的值加1。
12)执行步骤8)判断是否处理完成全部拆分元信息数组。
需要说明的是,很多时候并不需要将所有的列都解析出来,例如一个表中有15个列字段,用户查询仅查询第一列作为过滤条件,当行长度大于拆分长度时,第一个行分段就可以得到第一列数据信息,后面的列数据需要等待N个时钟周期才能得到结果,显然实际并不需要。此时,拆分模块只需要传输第一个分块即可,无需传输后面的分块,以加快结果的输出。
相较于相关技术中,使用一个8B位宽的RAM存放页面数据,对于举例中的行数据,只能逐字节的读取,对于举例中的行0长度350B,行1长度50B,行2长度150B,需要550个时钟周期才能全部读取。
而通过本申请实施例中的方式,虽然数据中存在冗余,相邻数据分段间需要添加空数据周期,但完成同样3行数据的读取操作,仅需要9个时钟周期,大幅缩短了数据读取操作所需的时钟周期。值得说明的是,本申请实施中,对行数据进行分段处理,由于相邻分段中需要间隔一定的时钟周期,本申请实施例中直接处理下一行的数据,并不对当前行阻塞插入空数据周期。同时,本例中页面中仅存储了3行数据,实际场景中页面中存储行数据较多,并不需要插入较多的空数据周期。
在上述步骤S210提供的技术方案中,可以但不限于通过以下方式通过解析模块从M行数据中获取至少部分列数据,并对至少部分列数据执行目标查询操作:通过解析模块获取M行数据中至少部分列的偏移地址,通过至少部分列的偏移地址获取M行数据中至少部分列的列数据。
在一个示范性实施例中,可以但不限于通过以下方式通过解析模块从M行数据中获取至少部分列数据,包括:在所述解析模块包括按流水线方式工作的T个列解析单元、且在第q个时钟周期上所述T个列解析单元中的第1个列解析单元获取到所述M行数据中的第m行数据中的第r个数据分段的情况下,在所述第q个时钟周期上通过所述第1个列解析单元中获取所述第r个数据分段中的一列数据,从第q+1个时钟周期开始的T-1个时钟周期内将所述第r个数据分段依次从所述第1个列解析单元输入到所述T个列解析单元中的第T个列解析单元,并在从第q+1个时钟周期开始的T-1个时钟周期中的每个时钟周期内,通过所述T个列解析单元中已接收到所述第r个数据分段的每个列解析单元分别获取所述第r个数据分段中不同的一列数据,其中,r为正整数,m为小于或等于M的正整数。
在数据库中,用户可以但不限于通过语句(例如,SQL语句)进行数据的查询操作。SQL语句中针对表中的列字段进行过滤、排序、选择等操作。而传统数据库中数据以行的形式存储在页面中,因此数据库需要先从页面中找到目标列字段,才能进行后续的过滤、排序、选择等操作。从页中找到目标列字段的计算操作称为解析操作。
图13是根据本申请实施例的一种可选的数据库页面的存储格式示意图,如图13所示,以PostgreSQL数据库为例,对于用户输入的行数据,以8KB为单位作为一个页面,进行数据表的存储。每一个8KB页面中存储若干行数据,页面中固定位置会标记该页面中所包含的行数量。从页面的顶部开始存储每个行的元信息(4B),在元信息中包含了行在页面中偏移与行的长度。从页面的底部开始存放行数据,一行中包含了多个列数据。由于存在变长数据,因此每一行的长度不同。
在创建数据表同时,会创建一份列字段属性表,列字段属性表中标记每个列的类型与长度。当列字段为定长列时,对应的列长度大于0。当列字段为变长列时,对应的列长度小于0,列数据的长度会存储在页面中,位于列字段的头部,当列长度较短时(小于128B)会使用1B表示列长度,当列长度较长时(>128B)会使用4B表示列长度。
由于行数据中存在变长列字段,当SQL语句中需要访问第N个列时,必须将前面N-1个列的位置都解析出来,才能得到第N个列在行数据中的偏移。例如图13举例中,如果要访问列4字段,由于列3为变长字段,每个行中的列3长度都可能不同,需要先从列字段属性表中得到列0,列1的长度,再从页面中找到变长列3的长度,累加计算后得到列4的长度。
大数据时代,数据量呈现指数级增长,数据表中往往有上亿条行记录,每个行中又有多个列字段,因此解析计算常常构成数据库的主要性能瓶颈,带来巨大的CPU运算负载与查询延迟。
为了降低CPU查询负载,减少查询延迟,现有技术中通过在FPGA或GPU中实现多个计算单元,以并行计算的方式实现数据库查询加速。图14是根据本申请实施例的一种可选的并行查询数据库中的数据的示意图,如图14所示,相关技术中,通过为每个页面创建一个计算单元,由于页面之间没有数据解析的相互依赖关系,因此可以多个计算单元并行的进行解析计算,从而提升解析效率。
可以理解的是,相关技术中,虽然通过创建大量计算单元并行的方式,实现了解析计算的加速,但单个计算单元中,仍是通过逐个字节的操作,来实现列字段的位置计算与列数据的提取。由于每个数据的访存至少需要一个时钟周期,该方式数据的访存效率很低,导致单个计算单元的性能不高。
本申请实施例在现有技术的基础上,对单个计算单元的内部设计进行进一步的优化。提出一种基于流水线的方式进行列数据的解析,通过在流水线上并行解析多个行的方式大幅提升计算单元的性能,从而更大程度的降低查询延迟。
本申请实施例中解析模块包含多个解析子模块,解析子模块数量与读取模块中,RAM阵列中的RAM组个数保持相同,图15是根据本申请实施例的一种可选的解析子模块的示意图,如图15所示,可以但不限于包括拆分元信息输入端口601、拆分数据输入端口602、列字段属性输入端口603、目标列选择输入端口604、解析流水线605、解析暂存表606、列解析单元607、解析结果缓存608和解析结果输出端口609。
拆分元信息输入端口601,接入拆分模块的拆分元信息输出端口。
拆分数据输入端口602,接入拆分模块的拆分数据输出端口。
列字段属性输入端口603,接入FPGA内存,由主机侧通过PCIe填充列字段属性信息。表征解析过程中所需的各个列的类型及长度信息。
目标列选择输入端口604,接入FPGA内存,由主机侧通过PCIe填充目标列选择信息。表征SQL语句中所需要进行过滤计算的列编号。
解析流水线605,由多个列解析单元构成,列解析单元之间通过FIFO传递数据,进行流水作业,每个列解析单元只负责一个列的解析。
解析暂存表606,用于多个分段场景下使用,当目标数据不在该分段中时,暂存该行的解析状态,等待该行的下一个分段来临时使用。
列解析单元607,进行一行中某个列的解析,每个时钟周期只进行一个列的解析。通过解析起始位置与当前列属性,计算该列有效数据在行中的起始位置与长度。
解析结果缓存608,内部包含多个缓存行,将解析完成的列,从分段数据中提取目标列内容,放入空闲缓存行中。
解析结果输出端口609,当一行中所有目标列都完成解析后,将目标列数据组成固定格式的数据包,发送至过滤单元。
可选的,在本实施例中,T个列解析单元中的各个列解析单元可以但不限于用于解析一个数据分段中不同列的列数据,可以理解的是,每个列解析单元可以但不限于用于解析的同一个数据分段中的不同列的列数据。
在一个示范性实施例中,可以但不限于通过以下方式通过解析模块从所述M行数据中获取至少部分列数据:在所述第r个数据分段不包括所述第m行数据中的目标列数据、且在所述T-1个时钟周期中所述T个列解析单元中的一个列解析单元被设置用于获取所述目标列数据的情况下,当所述一个列解析单元从所述第r个数据分段中获取不到所述目标列数据时,记录所述目标列数据的偏移地址,其中,所述目标查询操作所需查询的列数据集合包括所述目标列数据,所述偏移地址用于获取所述目标列数据;在所述第1个列解析单元获取到所述第m行数据中的第r+t个数据分段的情况下,通过所述第1个列解析单元利用所述目标列数据的偏移地址从所述第r+t个数据分段获取所述目标列数据,其中,t为正整数。
可选的,在本实施例中,可以但不限于通过以下方式确定目标列数据的偏移地址:确定第r个数据分段中目标列数据的前一个列数据的偏移地址;将目标列数据的偏移地址确定为前一个列数据的偏移地址与目标列数据包括的字节数之和,其中,目标列数据包括的字节数记录在列字段属性表中。
图16是根据本申请实施例的一种可选的解析子模块工作的流程示意图,如图16所示,可以但不限于包括以下步骤:
步骤701:从列字段属性输入端口载入列字段属性表。列字段属性表中,包含:类型、长度。
步骤702:从列字段数据选择端口载入列字段选择表。列字段选择表中,包含要选择的目标列字段索引。
步骤703:从拆分元信息输入端口中读取页面中元信息。子模块中会不断读取页面中的元信息,直到页面中最后一个元信息读取完成。
步骤704:从拆分数据输入端口中获读取分段数据。子模块中会不断读取页面中的分段数据,直到最后一个分段数据读取完成。
步骤705:将分段数据送入解析流水线中。
步骤706:解析单元进行目标列位置与长度计算。解析流水线中每个解析单元对一个分段数据进行一个列位置与长度的解析计算,当目标列偏移位置超过当前分段所在地址范围时,进行空操作,由最后一个列解析单元将目标列偏移位置存入列解析暂存表。
步骤707:缓存分段数据的解析结果。将解析流水线的计算结果存入到解析结果缓存中,根据列字段选择表,如果一行数据内的所有目标列,都解析完成,送入到解析结果输出端口。
步骤708:将目标列组成数据包,送入过滤模块进行过滤计算。
上述解析子模块的工作流程中设计到三个关键的部件:列解析单元607,解析结果缓存608,解析结果输出端口609。下面就上述三个关键部件设计进行说明:
1)列解析单元607,列解析单元负责对从分段数据中解析出某一列字段在数据分段中的偏移与长度。
对于列解析单元0,会有两个解析起始输入,对于行中的第一个分段,使用拆分元信息中的起始偏移值,对于行中的其它分段,使用解析暂存表中的值作为起始偏移。
对于列解析单元1-(N-1),只有一个解析起始输入,输出下一列的解析起始位置。
对于列解析单元N,从上一个列解析单元中获取解析起始位置,当行数据有多个分段时,如果解析起始偏移大于当前分段所在地址范围,将解析起始位置存入到解析暂存表中。
所有列解析单元的解析处理逻辑相同,从解析起始位置开始计算下一个列字段所在位置与长度。从列字段属性表中获取列字段的长度信息,按照如下流程计算列字段位置与长度。
图17是根据本申请实施例的一种可选的确定列字段位置与长度的示意图,如图17所示,获取解析起始位置作为当前位置,确定当前位置是否大于分段所在地址范围,在确定当前位置大于数据分段所在地址范围的情况下,执行空操作。当解析起始参数大于行长度拆分块长度乘以拆分段号时,进行空操作。
在确定当前位置分段小于或者等于数据分段所在地址范围的情况下,读取目标列长度,确定列长度是否大于0,在确定列长度大于0的情况下,将当前位置按照目标列长度对齐,将当前位置作为目标列起始位置;在确定列长度小于或者等于0的情况下,读取当前位置4B,确定第一字节是否等于0。
在第一字节等于0的情况下,更新当前位置4B对齐,将当前位置加4B作为目标列起始位置,在第一字节不等于0的情况下,判断列字段长度为1B还是4B,在列字段长度为4B的情况下,将当前位置加4B作为目标列起始位置,在列字段长度为1B的情况下,将当前位置加1B作为目标列起始位置。
将当前位置加目标列长度作为下一列解析起始位置。
2)解析结果缓存608,当最后一个列解析单元N完成计算后,会输出目标列的位置、长度与当前的分段数据。解析结果缓存中,根据列数据选择表,从当前分段数据中,拷贝目标数据到缓存行中。
值得说明的是,当行数据有多个分段时,可能出现目标列数据截断的场景,此时会对下一个分段中进行数据补齐操作。具体方法为:从下个分段的起始位置到下一列目标起始位置的内容作为补齐数据,填充到未完成的目标列中。
3)解析结果输出端口609,当一行中所有的目标列都完成解析与结果缓存后,将缓存行数据进行格式重组形成连续码流,输出到过滤模块中。图18是根据本申请实施例的一种可选的解析结果的示意图,如图18所示,码流格式为:页ID(801),页内行号(802),列数量(803),各个列的类型、长度、列数据(804),其中,在列数据(804)中可以但不限于包括列0类型(1B)、列0长度(2B)以及列0数据(1B~NB)。
例如,图19是根据本申请实施例的一种可选的解析示意图,如图19所示,在表格创建了4个列字段A、B、C、D,列字段的类型分别为整形,日期型,字符串,浮点数。由于整形、日期型与浮点数为定长字段,字符串为变长字段,因此在列字段属性表中对应的长度分别为4,4,-1,8。设数据表中行长度的平均值为256B,有一个页面存储了4行数据。用户输入SQL语句中,需要提取的目标字段为B、C、D字段。FPGA中设计流水线深度为4,支持4个列的解析。
逻辑上存储的行数据,经过拆分模块按照256B进行拆分后,形成5个有效数据分段与一个空数据分段,依次送入到列解析流水线中。
1)T1时刻,(行1,段0)进入列解析单元0;进行(行1,列A)的解析;
2)T2时刻:(行2,段0)进入列解析单元0,(行1,段0)进入列解析单元1;进行(行2,列A),(行1,列B)的解析;
3)T3时刻:(行3,段0)进入列解析单元0,(行2,段0)进入列解析单元1,(行1,段0)进入列解析单元2;进行(行3,列A),(行2,列B),(行1,列C)的解析;
4)T4时刻:(行4,段0)进入列解析单元0,(行3,段0)进入列解析单元1,(行2,段0)进入列解析单元2,(行1,段0)进入列解析单元3;进行(行4,列A),(行3,列B),(行2,列C),(行1,列D)的解析;此时行1完成全部列数据的解析,将结果输出到过滤模块;
5)T5时刻:空数据进入解析单元0,(行4,段0)进入列解析单元1,(行3,段0)进入列解析单元2,(行2,段0)进入列解析单元3;解析单元0空操作,进行(行4,列B),(行3,列C)的解析,列解析单元3计算出列D的位置并不在(行2,段0)中,因此将目标偏移地址,存入到解析暂存表中;
6)T6时刻:(行2,段1)进入列解析单元0, (行4,段0)进入列解析单元2,(行3,段0)进入列解析单元3;进行(行4,列C),(行3,列D)的解析;同时,解析单元0从解析暂存表中获取解析起始地址,进行(行2,列D)的解析;
7)T7时刻:(行2,段1)进入列解析单元3,进行(行4,列D)的解析,完成页面中全部数据的解析工作。
解析模块,可以但不限于包括一条T级流水线,进行行列数据的解析,T为最大支持的列个数。流水线中一次并行接收多个长位宽数据与拆分段号,读取行拆分元信息,行拆分数据,列字段属性表与列字段拆分表。流水线中每一级完成一个列字段的解析工作,完成之后将行数据送入下一级,更新解析起始参数,解析起始参数为当前列字段位置加上列字段长度。根据解析起始参数与列字段属性表,计算当前列在行数据中的偏移位置与长度。解析单元0对于行中的第一个分段,使用拆分元信息中的起始偏移值,对于行中的其它分段,使用解析暂存表中的值作为起始偏移;列解析单元1至(N-1),只有一个解析起始输入,输出下一列的解析起始位置;列解析单元N,从上一个列解析单元中获取解析起始位置,当行数据有多个分段时,如果解析起始偏移大于当前分段所在地址范围,将解析起始位置存入到解析暂存表中。解析模块,将起始参数对拆分长度取余,作为当前位置。列字段属性表为有符号整形数组,对应每一列长度,长度大于0时,表示列为定长字段,将当前位置进行字段对齐后,即为列起始位置;当行长度小于0时,表示列字段为变长字段,从当前位置处获取列字段长度信息,偏移长度信息所在字节后,即为列起始位置。解析模块,当解析起始参数大于行长度拆分块长度乘以拆分段号时,进行空操作。解析模块,当一行中所有分段数据都解析完成后,送入解析缓存。解析模块,根据目标列选择表,从拆分段中提取目标列数据,并标记页面号,行号、列长度、类型。
通过上述方式,相较于相关技术中,需要逐个列进行解析以获取偏移与长度,对于示例中的4行4列数据,至少需要16个时钟周期完成数据的解析工作。通过本申请实施例中的流水线解析方案,只需要7个时钟周期即可完成解析工作,大幅提升了解析的效率。需要说明的是,在举例中仅以4行4列为例,实际场景中随着列数与行数的增加,性能提升效果会更加显著。
在一个示范性实施例中,可以但不限于通过以下方式对所述至少部分列数据执行目标查询操作:将目标查询语句转换为连续的目标码流,其中,所述目标查询语句中携带了所述目标查询操作,所述目标码流中携带了一组运算码;根据所述目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,得到一组比较运算器和一组逻辑运算器;通过所述一组比较运算器和所述一组逻辑运算器对所述至少部分列数据执行所述目标查询操作。
可选的,在本实施中,一组运算码可以但不限于包括一组比较运算码和一组逻辑运算码中的至少一种,作为一种可选的示例,一组比较运算码可以但不限于包括大于、等于、小于中的至少一个等等,一组逻辑运算码可以但不限于包括与、或、非中的至少一个等等。
可选的,在本实施例中,数据库中用户可以但不限于通过目标查询语句(例如,SQL语句等等)进行数据的查询操作,目标查询语句中可以但不限于包括待查询的列字段和列字段的查询条件,例如,SQL语句中的select部分代表了对字段的选择,where子句代表了对表列字段的过滤条件。例如,某个表中包含a(整形), b(日期), c(字符串),d(浮点数)四个字段,select a where (b > 2023-01-01) and (c = ‘china’) and (d>1000),表示选择a字段,过滤条件为:b字段日期大于2023-01-01,c字段字符串值为china,d字段浮点数大于1000。
数据库中在完成了对页面的解析操作后,从页面中提取出了目标字段后,按照where子句部分进行过滤。对大量行数据的过滤计算,构成了主要的算力瓶颈之一。使用FPGA多并行计算能力,能够实现更高的算力。
然而相关技术中,需要从页面中逐个字节拷贝目标列的数据到比较计算单元后,开启计算,拷贝提取的时间耗时较长。例如:上述举例中,整形占用4个字节,日期4个字节,浮点8个字节,字符串x个字节,那么总计需要消耗4+4+8+x=16+x个时钟周期。多个条件码需要逐个执行,最终完成计算,需要较多时钟周期。例如上述举例中,有3个比较运算,至少需要3个时钟周期完成。
为了解决上述问题,本申请实施例中在过滤模块中,创建计算阵列,一次进行多种数据类型的过滤比较运算,同时使用长位宽,以更少的时钟周期完成数据的拷贝操作。
图20是根据本申请实施例的一种款的过滤模块的结构示意图,如图20所示,过滤模块使用一种条件编码,将SQL语句转为连续的码流,对比较运算器与逻辑运算器进行初始化操作,可以但不限于包括列字段数据输入端口901、列字段过滤条件码输入端口902、并行计算阵列903。
列字段数据输入端口901,外接解析模块。获取解析模块中打包的列字段数据,使用多个RAM端口并行接收数据,RAM端口使用FPGA所支持的最大位宽。例如:FPGA中最大支持512bit位宽,目标数据库页面中行数据最大长度为1KB,那么使用16个512bit的RAM存放解析模块的打包数据,一次可并行接收1KB数据。
列字段过滤条件码输入端口902,外接FPGA的外存(DDR),由用户通过Host一侧输入过滤条件码。表征了各个列的过滤条件与常量值,图21是根据本申请实施例的一种可选的编码规则的示意图,如图21所示,每一个过滤条件码固定为64B,其中包含了多个字段,具体含义如下:
1)函数类型码:表示函数运算的类型,用于选择使用的计算单元。比如:整形、字符串、浮点、日期等。
2)函数选择码:表示某一类型函数中运算符的选择,比如:大于、等于、小于等。
3)参数来源:表示函数参数为列字段中、常量,或者是其它运算符的结果,比如:上述举例中 b > 2023-01-01, 表示使用大于运算函数,函数的第一个参数来源于列,第二个参数来源于常量。(b > 2023-01-01) and (c = ‘china’) 中的and,两个参数来源于两个比较运算的结果。
4)参数长度:表示参数的长度,比如字符串‘China’长度为5。
5)参数索引/数据:当参数来源于列时,该字段表示列索引编号;当参数来源于常量时,存储常量数据;当参数来源于其它运算符时,存储运算符的编号。比如:上述举例中 b> 2023-01-01,第一个参数来源于列,因此该字段表示索引值为1(地址从0开始);第二个参数来源于常量,因此该字段表示数据,值为2023-01-01;(b > 2023-01-01) and (c =‘china’) 中的and,运算符编号分别为0,1。
并行计算阵列903可以但不限于包括针对不同数据类型的计算阵列,图22是根据本申请实施例的一种可选的并行计算阵列的结构示意图,如图22所示,可以但不限于包括逻辑运算器1001、比较运算器1002、比较运算单元1003和参数选择器1004。
逻辑运算器1001,由多个树状的逻辑运算单元组成,处理过滤条件中的逻辑运算,包含与、或、非三种运算。当函数类型码(func_type)为逻辑运算类型时,配置运算器中的与或非参数并使能。
比较运算器1002,由不同数据类型的比较运算阵列构成,处理过滤条件中的比较运算,不同阵列支持不同的数据类型的运算,每个阵列中包含的多个比较运算单元。当函数类型码(func_type)为比较运算时,配置使能的比较运算参数,有效位选择器会输出参与计算的有效位进行输出。
比较运算单元1003,由多个不同比较运算器构成,用于执行数据的比较运算,多个运算器会并行执行比较计算,通过函数选择码(func_sel)选择对应的比较运算结果作为输出。
参数选择器1004,由两个长位宽的寄存器构成,根据参数的来源,从列字段或常量中选择参数送入比较运算单元中进行计算。
可选的,在本实施例中,目标查询操作可以但不限于包括比较运算、逻辑运算操作等等,比较运算可以但不限于包括大于运算、小于运算和等于运算等等,逻辑运算操作可以但不限于包括与运算操作、或运算操作和非运算操作等等。
在一个示范性实施例中,可以但不限于通过以下方式根据所述目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,得到一组比较运算器和一组逻辑运算器:在所述目标查询语句包括预设的C个比较参数、且一组运算码包括C个比较运算码的情况下,将所述C个比较参数和所述C个比较运算码所对应的C个比较运算配置至C个初始比较运算器,得到C个比较运算器,其中,所述一组初始比较运算器包括所述C个初始比较运算器,所述一组比较运算器包括所述C个比较运算器,C为大于或者等于1的正整数;在所述一组运算码包括D个逻辑运算码的情况下,将C个比较结果和所述D个逻辑运算码所对应的逻辑运算配置至D个初始逻辑运算器,得到D个逻辑运算器,其中,所述C个比较结果是所述C个比较运算器对所述至少部分列数据并行执行C个比较操作得到的,所述一组初始逻辑运算器包括所述D个初始逻辑运算器,所述一组逻辑运算器包括所述D个逻辑运算器,D为大于或者等于1的正整数。
可选的,可以但不限于根据目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,可以理解的是,将对一组初始比较运算器中各个初始比较运算器所执行的比较运算和比较参数进行配置,对一组初始逻辑运算器中各个初始逻辑运算器的逻辑运算和进行逻辑运算的对象(例如,比较结果)进行配置,得到一组比较运算器和一组逻辑运算器。
在一个示范性实施例中,可以但不限于通过以下方式对所述至少部分列数据执行所述目标查询操作:在所述目标查询操作包括C个比较操作和D个逻辑运算操作的情况下,通过C个比较运算器对所述至少部分列数据并行执行所述C个比较操作,得到C个比较结果,其中,C和D为大于或等于2的正整数,所述D个逻辑运算操作包括一级或多级逻辑运算操作,所述一级或多级逻辑运算操作中当前一级逻辑运算操作的结果是下一级逻辑运算的输入;通过D个逻辑运算器对所述C个比较结果逐级执行所述D个逻辑运算操作。
可选的,在本实施例中,C个比较运算器中的各个比较运算器可以但不限于用于对至少部分列数据中的各列数据并行执行C个比较操作中的一个比较操作,C个比较操作中的各个比较操作可以但不限于不同,或者,C个比较操作中可以但不限于包括部分相同的比较操作。
可选的,在本实施例中,通过D个逻辑运算器对C个比较结果逐级执行D个逻辑运算操作,可以理解的是,逐级执行D个逻辑运算操作的时候,可以但不限于同时执行D个逻辑运算操作中的至少一个逻辑运算操作。
图23是根据本申请实施例的一种可选的并行计算阵列的计算的流程图一,如图23所示,可以但不限于包括以下步骤:
步骤1101:根据函数类型码(func_type),配置逻辑运算器。将扫描过滤条件码中的逻辑运算,配置到逻辑运算器中的计算单元中,并使能相应的计算单元。
步骤1102:根据函数类型码(func_type),配置比较运算器。将扫描过滤条件码中的比较运算,配置到对应数据类型的运算阵列中,使能运算阵列中对应的比较运算单元。
步骤1103:根据函数选择码(func_sel),配置比较运算单元。选择数据类型中的比较运算作为输出结果。
步骤1104:根据参数来源(arg_src)配置常量参数。将常量参数拷贝到比较运算单元的参数缓存寄存器中。
步骤1105:从列字段数据输入端口中读取列数据。
步骤1106:根据参数来源(arg_src)配置变量参数。将列字段中的数据载入到对应比较运算单元的参数缓存寄存器中。
步骤1107:启动运算。计算参数载入就绪后,启动计算阵列进行并行计算。会得到一个1比特位的运算结果,表示该行数据是否满足过滤条件。
步骤1108:判断是否为页面中最后一行。如果不是,则执行步骤1105,继续下一行数据的过滤计算,否则执行步骤1109完成计算。
例如,假设有表格中包含4个字段A(整形)、B(日期型)、C(浮点型)、D(字符串),用户输入如下几种过滤条件:1)SQL1:(A>100 AND B > 2020-01-01) OR (C <99.5 AND D =‘China’),图24是根据本申请实施例的一种可选的计算过程示意图,如图24所示,过滤条件码先编码比较运算,之后编码逻辑运算。
初始化时,由于func_type中有3个逻辑运算,逻辑运算器,使用4输入的树状结构,两个时钟周期,即可完成逻辑运算。初始化时,由于func_type中涉及到4种数据类型的比较运算,每种类型只用到了一个比较运算单元,因此使能比较运算器中对应的运算单元,四种数据类型的运算并行执行,只需要一个时钟周期。
初始化时,根据func_sel设置各种比较运算类型选择的运算符,例如:>、>、<、=。
初始化时,根据arg_src从过滤条件码中载入不同类型数据中的常量信息。
不断的读取行数据,从行数据中,根据arg_src载入列字段数据到参数缓存寄存器中。
启动比较运算器与逻辑运算器,对于每一行数据,经过3个时钟周期的计算延迟后,即可计算得出该行是否满足过滤条件。
又例如,用户输入过滤条件可以但不限于包括:SQL2:(A>100 AND B > 2020-01-01)OR C < 99.5,图25是根据本申请实施例的一种可选的并行计算阵列的计算的流程图二,如图25所示,与SQL1不同的是:SQL2只有2个逻辑运算。由于逻辑运算器中为满二叉树结构,因此初始化时,仍会选择4输入的树状结构。条件码编码时会将C<99.5等效为 (C<99.5AND 1),编号4的条件码的参数2的来源arg2_src会标记为常量,参数2的数据值会设置为1。其余步骤计算与SQL1相同。
又例如,用户输入过滤条件可以但不限于包括:(A>100 AND B > 2020-01-01),图26是根据本申请实施例的一种可选的并行计算阵列的计算的流程图三,如图26所示,与SQL1、SQL2不同的是:SQL3只有1个逻辑运算,因此逻辑运算器选择2输入的树状结构,只需要1个时钟周期完成逻辑运算。其余步骤与SQL1相同,数据经过2个时钟的计算延迟,即可计算得出该行是否满足过滤条件。
相较于相关技术中,普遍采用逐个遍历比较运算符的方式,进行过滤条件的计算,导致耗时较长。例如上述举例中: SQL1:(A>100 AND B > 2020-01-01) OR (C <99.5 ANDD =‘China’),涉及7个运算符,至少需要7个时钟周期才能得出运算结果。使用本发明,只需要3个时钟周期即可得出运算结果,大幅提升了计算效率。需要说明的是,当过滤条件越多,本申请实施例中的方案相比相关技术性能提升幅度越大。
在一个示范性实施例中,对从所述N个RAM中并行读取出的所述目标页面中的数据执行目标查询操作之后,上述方法还包括:在通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作,得到目标查询结果的情况下,将所述目标查询结果写入到所述片外内存中。
可选的,在本实施例中,目标查询结果中可以但不限于包括目标数据库的目标页面的ID和行标识,例如,行标识用于表示在对读取出的所述目标页面中的数据执行目标查询操作之后所得到的行号;或者,目标查询结果中可以但不限于包括对并行提取出的目标页面中的数据执行目标查询操作之后所得到的数据等等。
当过滤模块完成过滤后,需要将过滤结果存储至FPGA的片外DDR中,由主机侧读取后进行后续步骤的处理。本申请实施例中回写模块将满足过滤条件的行所在的页面ID与页面内行号作为过滤结果写入到DDR中,由Host一侧进行后续步骤的处理。
当过滤模块中判断该行满足过滤条件时,会将页面的ID与行号,发送到回写模块,回写模块读取页面ID与行号,作为过滤结果进行缓存,并更新计数值。当一批页面完成计算后,将过滤结果与计数值批量写入FPGA片外存储器中,并向主机侧发出中断。
主机侧收到中断后,从FPGA的片外存储器中读取过滤计算的结果。
需要说明的是,本申请实施例中FPGA接收的原始页面数据,CPU侧需要将原始页面发送到FPGA中进行运算,发送过程或占据较大的传输带宽。而现实中原始页面数据中往往有很多重复数据,意味有较高的压缩比,同时FPGA非常擅长解压计算。如果CPU侧先将数据压缩后,再传输到FPGA中,由FPGA进行解压计算后再送入到读取模块中,可以大幅降低CPU与FPGA之间的传输带宽消耗。
本申请实施例中的过滤模块,为了简便说明,只阐述了比较运算符的支持,每个类型的变量存储深度为1,如果要支持算术运算,可以扩大存储深度,用于暂存中间运算结果。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。
在本实施例中还提供了一种数据库访问装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图27是根据本申请实施例的数据库访问装置的结构框图,如图27所示,该装置包括:
写入模块2702,用于将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,其中,N为正整数,每个RAM的数据位宽为K个字节,K为2的幂次方;
第一读取模块2704,用于在所述目标页面包括M行数据的情况下,从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,其中,M为正整数,所述M个元信息中的每个元信息包括所述M行数据中对应的一行数据在所述目标页面中的行起始位置和所述对应的一行数据包括的字节数量,在每个时钟周期上从所述N个RAM中并行读取的数据包括N×K个字节的数据;
确定模块2706,用于根据所述M个元信息,确定M个拆分元信息,其中,所述M个拆分元信息中的每个拆分元信息包括所述M行数据中对应的一行数据在所述N个RAM中的存储起始位置、所述对应的一行数据包括的字节数量以及所述对应的一行数据被拆分成的数据分段的数量;
第二读取模块2708,用于根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,并以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,其中,在每个时钟周期上从所述N个RAM中并行读取的数据包括所述M行数据中的N×K个字节的数据,每个数据分段被设置为在一个时钟周期上发送到所述解析模块;
获取模块2710,用于通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作。
通过本申请,每个RAM的数据位宽为2的幂次方,可以理解的是,在每个时钟周期上可以批量将数据库的数据页面中的2的幂次方的字节写入到N个RAM中,在目标页面包括M行数据的情况下,从N个RAM中读取M行数据中的每行数据的元信息,得到M个元信息,M个元信息中的每个元信息包括M行数据中对应的一行数据在目标页面中的行起始位置和对应的一行数据包括的字节数量,在每个时钟周期上从N个RAM中并行读取的数据包括N×K个字节的数据,可以理解的是,在每个时钟周期上从多个RAM中并行批量地读取多行数据的元信息,根据M个元信息,确定M个拆分元信息,M个拆分元信息中的每个拆分元信息包括M行数据中对应的一行数据在N个RAM中的存储起始位置、对应的一行数据包括的字节数量以及对应的一行数据被拆分成的数据分段的数量,根据M个拆分元信息,从N个RAM中并行读取目标页面中的数据,并以数据分段为单位将M行数据中的每行数据被拆分成的数据分段发送到解析模块,可以理解的是,根据M个拆分元信息,将M行数据中的每行数据进行拆分,得到对应的数据分段,每个数据分段被设置为在一个时钟周期上发送到解析模块,通过解析模块从M行数据中获取至少部分列数据,并对至少部分列数据执行目标查询操作,可以理解的是,对至少部分列数据并行地执行查询操作,实现了批量读取多个RAM中存储的数据、批量地读取多行数据的元信息,并批量地确定多行数据的拆分元信息,解析模块批量获取至少部分列数据,进而对获取到的至少部分列数据进行处理,因此,可以解决数据库访问效率较低的问题,达到提升数据库访问效率的效果。
在一个示范性实施例中,所述写入模块,包括:
第一写入单元,用于在每个时钟周期上将所述目标页面中的K个字节的数据写入到所述N个RAM中的一个RAM中,其中,所述目标数据库是所述目标芯片的片外内存中存储的数据库,所述N个RAM按时钟周期被依次写入所述目标页面中的K个字节的数据。
在一个示范性实施例中,所述写入模块,包括:
第二写入单元,用于在第i个时钟周期上,当j不等于0时,将所述目标页面中的第i组数据写入所述N个RAM中的第j个RAM中,当j等于0时,将所述第i组数据写入所述N个RAM中的第N个RAM中,其中,所述第i组数据包括K个字节的数据,i为正整数,j为将i除以N所得的余数,j为正整数。
在一个示范性实施例中,在所述目标数据库或所述目标页面包括多行数据的情况下,N是根据所述多行数据中的每行数据包括的字节数量与所述每个RAM的数据位宽所确定得到的值。
在一个示范性实施例中,N为对目标比值进行向上取整所得到的值,其中,所述目标比值是将目标行长度除以K所得到的比值,所述目标行长度是所述多行数据中的每行数据包括的字节数量的均值,或者,是所述多行数据中的每行数据包括的字节数量中出现次数最多的字节数量。
在一个示范性实施例中,K是所述目标芯片的内部总线所允许读写的最大数据位宽。
在一个示范性实施例中,所述第二读取模块,包括:
第一读取单元,用于在将所述目标页面中的全部数据写入到所述N个RAM之后,从所述N个RAM中并行读取所述目标页面中的数据。
在一个示范性实施例中,所述写入模块,包括:第三写入单元,用于在所述目标芯片中具有多个RAM组的情况下,将所述目标页面中的数据写入到所述目标芯片中的第一RAM组中的所述N个RAM,其中,所述多个RAM组中的每个RAM组中包括的RAM的数量均为N;
所述第二读取模块,包括:第二读取单元,用于根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述目标页面中的数据;
所述装置还包括:第三读取模块,用于在所述目标数据库包括一组页面、且所述目标页面是所述一组页面中的第一页面的情况下,在根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述第一页面中的数据的过程中,将所述目标数据库中的第二页面中的数据写入到所述多个RAM组中的第二RAM组包括的N个RAM。
在一个示范性实施例中,在所述多个RAM组为U个RAM组,U是将第一时长除以第二时长所得到的比值,其中,所述第一时长用于表示所述解析模块解析所述目标数据库中的一个页面所需的平均时长,所述第二时长是将W除以K所得到的比值,W表示所述目标数据库中的一个页面中包括的平均字节数量,W为正整数。
在一个示范性实施例中,所述第一读取模块,包括:
第一获取单元,用于从所述N个RAM中并行读取第一组数据,并从所述第一组数据中获取目标行数,其中,所述第一组数据是所述目标页面中的N×K个字节的数据,所述第一组数据包括所述目标行数,所述目标行数等于M,所述目标行数用于指示所述目标页面中包括的数据的行数为M;
第二获取单元,用于在所述第一组数据不包括所述M个元信息的情况下,根据所述目标行数,从所述N个RAM中获取所述M个元信息;
第三获取单元,用于在所述第一组数据包括所述M个元信息中的P个元信息的情况下,从所述第一组数据中获取所述P个元信息,并根据所述目标行数,从所述N个RAM中获取所述M个元信息中除所述P个元信息之外的M-P个元信息,其中,P为小于M的正整数。
在一个示范性实施例中,所述第三获取单元,用于:
在所述M个元信息中的每个元信息包括R个字节的数据、且M×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M个元信息。
在一个示范性实施例中,所述第三获取单元,用于:
在所述M个元信息中的每个元信息包括R个字节的数据、且(M-P)×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M-P个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M-P个元信息。
在一个示范性实施例中,所述确定模块,用于通过以下单元根据所述M个元信息中的第m个元信息,确定所述M个拆分元信息中的第m个拆分元信息,其中,m为小于或等于M的正整数,所述第m个元信息包括第m个行起始位置和第m个字节数量,所述第m个行起始位置用于表示所述M行数据中的第m行数据在所述目标页面中的行起始位置,所述第m个字节数量用于表示所述第m行数据包括的字节数量:
第一确定单元,用于根据所述第m个行起始位置和所述第m个字节数量,确定所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址;
第二确定单元,用于根据所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,确定第m个数量,其中,所述第m个数量用于表示所述第m行数据被拆分成的数据分段的数量;
第三确定单元,用于根据所述第m个字节数量,确定所述第m行数据在所述N个RAM中的第m个存储起始位置;
第四确定单元,用于将所述第m个拆分元信息确定为包括所述第m个存储起始位置、所述第m个字节数量和所述第m个数量。
在一个示范性实施例中,所述第m个拆分元信息包括:第m个行发送间隔计数值,其中,所述第m个行发送间隔计数值用于在第m行数据被拆分成的数据分段的数量大于或者等于2的情况下,所述第m行数据的相邻两个数据分段被发送至所述解析模块之间所间隔的时钟周期,或者在所述第m行数据被拆分成的数据分段的数量为1的情况下,所述第m行数据与所述第m行数据的下一行数据的数据分段被发送至所述解析模块之间所间隔的时钟周期。
在一个示范性实施例中,所述第一确定单元,用于:
在所述第m个行起始位置包括所述目标页面中的第Qm个字节的情况下,将所述第m行数据在所述N个RAM中的起始存储地址确定为对Qm/K进行向下取整所得到的值,并将所述第m行数据在所述N个RAM中的结束存储地址确定为对(Qm+所述第m个字节数量)/K进行向上取整所得到的值,其中,Qm为正整数。
在一个示范性实施例中,所述第二确定单元,用于:
在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的同一行的情况下,将所述第m个数量确定为等于1;
在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的不同行的情况下,将所述第m个数量确定为等于(|A-B|+1),其中,所述起始存储地址表示所述N个RAM中的第A行,所述结束存储地址表示所述N个RAM中的第B行,A和B为正整数,A和B不相同。
在一个示范性实施例中,所述第三确定单元,用于:
在m等于1、且所述第m个字节数量小于或等于N×K的情况下,将所述第m个存储起始位置确定为(N×K-所述第m个字节数量+1);
在m等于1、且所述第m个字节数量大于N×K的情况下,将所述第m个存储起始位置确定为(N×K-第m个余数+1),其中,所述第m个余数等于将所述第m个字节数量除以(N×K)所得到的余数;
在m大于1、且所述第m个字节数量小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个字节数量),其中,所述第m-1个存储起始位置是所述M行数据中的第m-1行数据在所述N个RAM中的存储起始位置;
在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个余数);
在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数大于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(N×K-(所述第m个余数-所述第m-1个存储起始位置))。
在一个示范性实施例中,所述第二读取模块,包括:
发送单元,用于在所述M行数据中的一行数据被拆分成多个数据分段的情况下,所述多个数据分段中的相邻两个数据分段间隔T个时钟周期被发送到所述解析模块,其中,T为大于或等于2的正整数,T等于所述解析模块中流水线级数。
在一个示范性实施例中,所述获取模块,包括:
第四获取单元,用于在所述解析模块包括按流水线方式工作的T个列解析单元、且在第q个时钟周期上所述T个列解析单元中的第1个列解析单元获取到所述M行数据中的第m行数据中的第r个数据分段的情况下,在所述第q个时钟周期上通过所述第1个列解析单元中获取所述第r个数据分段中的一列数据,从第q+1个时钟周期开始的T-1个时钟周期内将所述第r个数据分段依次从所述第1个列解析单元输入到所述T个列解析单元中的第T个列解析单元,并在从第q+1个时钟周期开始的T-1个时钟周期中的每个时钟周期内,通过所述T个列解析单元中已接收到所述第r个数据分段的每个列解析单元分别获取所述第r个数据分段中不同的一列数据,其中,r为正整数,m为小于或等于M的正整数。
在一个示范性实施例中,所述获取模块,还包括:
记录单元,用于在所述第r个数据分段不包括所述第m行数据中的目标列数据、且在所述T-1个时钟周期中所述T个列解析单元中的一个列解析单元被设置用于获取所述目标列数据的情况下,当所述一个列解析单元从所述第r个数据分段中获取不到所述目标列数据时,记录所述目标列数据的偏移地址,其中,所述目标查询操作所需查询的列数据集合包括所述目标列数据,所述偏移地址用于获取所述目标列数据;
第五获取单元,用于在所述第1个列解析单元获取到所述第m行数据中的第r+t个数据分段的情况下,通过所述第1个列解析单元利用所述目标列数据的偏移地址从所述第r+t个数据分段获取所述目标列数据,其中,t为正整数。
在一个示范性实施例中,所述获取模块,包括:
转化单元,用于将目标查询语句转换为连续的目标码流,其中,所述目标查询语句中携带了所述目标查询操作,所述目标码流中携带了一组运算码;
初始化单元,用于根据所述目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,得到一组比较运算器和一组逻辑运算器;
执行单元,用于通过所述一组比较运算器和所述一组逻辑运算器对所述至少部分列数据执行所述目标查询操作。
在一个示范性实施例中,所述初始化单元,用于:
在所述目标查询语句包括预设的C个比较参数、且一组运算码包括C个比较运算码的情况下,将所述C个比较参数和所述C个比较运算码所对应的C个比较运算配置至C个初始比较运算器,得到C个比较运算器,其中,所述一组初始比较运算器包括所述C个初始比较运算器,所述一组比较运算器包括所述C个比较运算器,C为大于或者等于1的正整数;
在所述一组运算码包括D个逻辑运算码的情况下,将C个比较结果和所述D个逻辑运算码所对应的逻辑运算配置至D个初始逻辑运算器,得到D个逻辑运算器,其中,所述C个比较结果是所述C个比较运算器对所述至少部分列数据并行执行C个比较操作得到的,所述一组初始逻辑运算器包括所述D个初始逻辑运算器,所述一组逻辑运算器包括所述D个逻辑运算器,D为大于或者等于1的正整数。
在一个示范性实施例中,所述执行单元,用于:
在所述目标查询操作包括C个比较操作和D个逻辑运算操作的情况下,通过C个比较运算器对所述至少部分列数据并行执行所述C个比较操作,得到C个比较结果,其中,C和D为大于或等于2的正整数,所述D个逻辑运算操作包括一级或多级逻辑运算操作,所述一级或多级逻辑运算操作中当前一级逻辑运算操作的结果是下一级逻辑运算的输入;
通过D个逻辑运算器对所述C个比较结果逐级执行所述D个逻辑运算操作。
在一个示范性实施例中,所述装置还包括:
在通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作,得到目标查询结果的情况下,将所述目标查询结果写入到所述片外内存中。
需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。
本申请的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
在一个示例性实施例中,上述计算机可读存储介质可以包括但不限于:U盘、只读存储器(Read-Only Memory,简称为ROM)、随机存取存储器(Random Access Memory,简称为RAM)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
本申请的实施例还提供了一种电子设备,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
在一个示例性实施例中,上述电子设备还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
本实施例中的具体示例可以参考上述实施例及示例性实施方式中所描述的示例,本实施例在此不再赘述。
显然,本领域的技术人员应该明白,上述的本申请的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本申请不限制于任何特定的硬件和软件结合。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (27)

1.一种数据库访问方法,其特征在于,
包括:
将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,其中,N为正整数,每个RAM的数据位宽为K个字节,K为2的幂次方;
在所述目标页面包括M行数据的情况下,从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,其中,M为正整数,所述M个元信息中的每个元信息包括所述M行数据中对应的一行数据在所述目标页面中的行起始位置和所述对应的一行数据包括的字节数量,在每个时钟周期上从所述N个RAM中并行读取的数据包括N×K个字节的数据;
根据所述M个元信息,确定M个拆分元信息,其中,所述M个拆分元信息中的每个拆分元信息包括所述M行数据中对应的一行数据在所述N个RAM中的存储起始位置、所述对应的一行数据包括的字节数量以及所述对应的一行数据被拆分成的数据分段的数量;
根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,并以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,其中,在每个时钟周期上从所述N个RAM中并行读取的数据包括所述M行数据中的N×K个字节的数据,每个数据分段被设置为在一个时钟周期上发送到所述解析模块;
通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作。
2.根据权利要求1所述的方法,其特征在于,
所述将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,包括:
在每个时钟周期上将所述目标页面中的K个字节的数据写入到所述N个RAM中的一个RAM中,其中,所述目标数据库是所述目标芯片的片外内存中存储的数据库,所述N个RAM按时钟周期被依次写入所述目标页面中的K个字节的数据。
3.根据权利要求1所述的方法,其特征在于,
所述将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,包括:
在第i个时钟周期上,当j不等于0时,将所述目标页面中的第i组数据写入所述N个RAM中的第j个RAM中,当j等于0时,将所述第i组数据写入所述N个RAM中的第N个RAM中,其中,所述第i组数据包括K个字节的数据,i为正整数,j为将i除以N所得的余数,j为正整数。
4.根据权利要求1所述的方法,其特征在于,
在所述目标数据库或所述目标页面包括多行数据的情况下,N是根据所述多行数据中的每行数据包括的字节数量与所述每个RAM的数据位宽所确定得到的值。
5.根据权利要求4所述的方法,其特征在于,
N为对目标比值进行向上取整所得到的值,其中,所述目标比值是将目标行长度除以K所得到的比值,所述目标行长度是所述多行数据中的每行数据包括的字节数量的均值,或者,是所述多行数据中的每行数据包括的字节数量中出现次数最多的字节数量。
6.根据权利要求1所述的方法,其特征在于,
K是所述目标芯片的内部总线所允许读写的最大数据位宽。
7.根据权利要求1所述的方法,其特征在于,
所述从所述N个RAM中并行读取所述目标页面中的数据,包括:
在将所述目标页面中的全部数据写入到所述N个RAM之后,从所述N个RAM中并行读取所述目标页面中的数据。
8.根据权利要求1所述的方法,其特征在于,
所述将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,包括:在所述目标芯片中具有多个RAM组的情况下,将所述目标页面中的数据写入到所述目标芯片中的第一RAM组中的所述N个RAM,其中,所述多个RAM组中的每个RAM组中包括的RAM的数量均为N;
所述根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,包括:根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述目标页面中的数据;
所述方法还包括:在所述目标数据库包括一组页面、且所述目标页面是所述一组页面中的第一页面的情况下,在根据所述M个拆分元信息,从所述第一RAM组中包括的所述N个RAM中并行读取所述第一页面中的数据的过程中,将所述目标数据库中的第二页面中的数据写入到所述多个RAM组中的第二RAM组包括的N个RAM。
9.根据权利要求8所述的方法,其特征在于,
在所述多个RAM组为U个RAM组,U是将第一时长除以第二时长所得到的比值,其中,所述第一时长用于表示所述解析模块解析所述目标数据库中的一个页面所需的平均时长,所述第二时长是将W除以K所得到的比值,W表示所述目标数据库中的一个页面中包括的平均字节数量,W为正整数。
10.根据权利要求1所述的方法,其特征在于,
所述从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,包括:
从所述N个RAM中并行读取第一组数据,并从所述第一组数据中获取目标行数,其中,所述第一组数据是所述目标页面中的N×K个字节的数据,所述第一组数据包括所述目标行数,所述目标行数等于M,所述目标行数用于指示所述目标页面中包括的数据的行数为M;
在所述第一组数据不包括所述M个元信息的情况下,根据所述目标行数,从所述N个RAM中获取所述M个元信息;
在所述第一组数据包括所述M个元信息中的P个元信息的情况下,从所述第一组数据中获取所述P个元信息,并根据所述目标行数,从所述N个RAM中获取所述M个元信息中除所述P个元信息之外的M-P个元信息,其中,P为小于M的正整数。
11.根据权利要求10所述的方法,其特征在于,
所述根据所述目标行数,从所述N个RAM中获取所述M个元信息,包括:
在所述M个元信息中的每个元信息包括R个字节的数据、且M×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M个元信息。
12.根据权利要求10所述的方法,其特征在于,
所述根据所述目标行数,从所述N个RAM中获取所述M个元信息中除所述P个元信息之外的M-P个元信息,包括:
在所述M个元信息中的每个元信息包括R个字节的数据、且(M-P)×R小于或等于N×K的情况下,从所述N个RAM中并行读取第二组数据,并从所述第二组数据中获取所述M-P个元信息,其中,所述第二组数据是所述目标页面中的N×K个字节的数据,所述第二组数据包括所述M-P个元信息。
13.根据权利要求1所述的方法,其特征在于,
所述根据所述M个元信息,确定M个拆分元信息,包括:
通过以下步骤根据所述M个元信息中的第m个元信息,确定所述M个拆分元信息中的第m个拆分元信息,其中,m为小于或等于M的正整数,所述第m个元信息包括第m个行起始位置和第m个字节数量,所述第m个行起始位置用于表示所述M行数据中的第m行数据在所述目标页面中的行起始位置,所述第m个字节数量用于表示所述第m行数据包括的字节数量:
根据所述第m个行起始位置和所述第m个字节数量,确定所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址;
根据所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,确定第m个数量,其中,所述第m个数量用于表示所述第m行数据被拆分成的数据分段的数量;
根据所述第m个字节数量,确定所述第m行数据在所述N个RAM中的第m个存储起始位置;
将所述第m个拆分元信息确定为包括所述第m个存储起始位置、所述第m个字节数量和所述第m个数量。
14.根据权利要求13所述的方法,其特征在于,
所述第m个拆分元信息包括:第m个行发送间隔计数值,其中,所述第m个行发送间隔计数值用于在第m行数据被拆分成的数据分段的数量大于或者等于2的情况下,所述第m行数据的相邻两个数据分段被发送至所述解析模块之间所间隔的时钟周期,或者在所述第m行数据被拆分成的数据分段的数量为1的情况下,所述第m行数据与所述第m行数据的下一行数据的数据分段被发送至所述解析模块之间所间隔的时钟周期。
15.根据权利要求13所述的方法,其特征在于,
所述根据所述第m个行起始位置和所述第m个字节数量,确定所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,包括:
在所述第m个行起始位置包括所述目标页面中的第Qm个字节的情况下,将所述第m行数据在所述N个RAM中的起始存储地址确定为对Qm/K进行向下取整所得到的值,并将所述第m行数据在所述N个RAM中的结束存储地址确定为对(Qm+所述第m个字节数量)/K进行向上取整所得到的值,其中,Qm为正整数。
16.根据权利要求13所述的方法,其特征在于,
所述根据所述第m行数据在所述N个RAM中的起始存储地址和结束存储地址,确定第m个数量,包括:
在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的同一行的情况下,将所述第m个数量确定为等于1;
在所述第m行数据在所述N个RAM中的所述起始存储地址和所述结束存储地址表示所述N个RAM中的不同行的情况下,将所述第m个数量确定为等于(|A-B|+1),其中,所述起始存储地址表示所述N个RAM中的第A行,所述结束存储地址表示所述N个RAM中的第B行,A和B为正整数,A和B不相同。
17.根据权利要求13所述的方法,其特征在于,
所述根据所述第m个字节数量,确定所述第m行数据在所述N个RAM中的第m个存储起始位置,包括:
在m等于1、且所述第m个字节数量小于或等于N×K的情况下,将所述第m个存储起始位置确定为(N×K-所述第m个字节数量+1);
在m等于1、且所述第m个字节数量大于N×K的情况下,将所述第m个存储起始位置确定为(N×K-第m个余数+1),其中,所述第m个余数等于将所述第m个字节数量除以(N×K)所得到的余数;
在m大于1、且所述第m个字节数量小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个字节数量),其中,所述第m-1个存储起始位置是所述M行数据中的第m-1行数据在所述N个RAM中的存储起始位置;
在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数小于或等于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(所述第m-1个存储起始位置-所述第m个余数);
在m大于1、且所述第m个字节数量大于(所述第m-1个存储起始位置-1)、所述第m个余数大于(第m-1个存储起始位置-1)的情况下,将所述第m个存储起始位置确定为(N×K-(所述第m个余数-所述第m-1个存储起始位置))。
18.根据权利要求1所述的方法,其特征在于,
所述以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,包括:
在所述M行数据中的一行数据被拆分成多个数据分段的情况下,所述多个数据分段中的相邻两个数据分段间隔T个时钟周期被发送到所述解析模块,其中,T为大于或等于2的正整数,T等于所述解析模块中流水线级数。
19.根据权利要求1所述的方法,其特征在于,
所述通过所述解析模块从所述M行数据中获取至少部分列数据,包括:
在所述解析模块包括按流水线方式工作的T个列解析单元、且在第q个时钟周期上所述T个列解析单元中的第1个列解析单元获取到所述M行数据中的第m行数据中的第r个数据分段的情况下,在所述第q个时钟周期上通过所述第1个列解析单元中获取所述第r个数据分段中的一列数据,从第q+1个时钟周期开始的T-1个时钟周期内将所述第r个数据分段依次从所述第1个列解析单元输入到所述T个列解析单元中的第T个列解析单元,并在从第q+1个时钟周期开始的T-1个时钟周期中的每个时钟周期内,通过所述T个列解析单元中已接收到所述第r个数据分段的每个列解析单元分别获取所述第r个数据分段中不同的一列数据,其中,r为正整数,m为小于或等于M的正整数。
20.根据权利要求19所述的方法,其特征在于,
所述通过所述解析模块从所述M行数据中获取至少部分列数据,还包括:
在所述第r个数据分段不包括所述第m行数据中的目标列数据、且在所述T-1个时钟周期中所述T个列解析单元中的一个列解析单元被设置用于获取所述目标列数据的情况下,当所述一个列解析单元从所述第r个数据分段中获取不到所述目标列数据时,记录所述目标列数据的偏移地址,其中,所述目标查询操作所需查询的列数据集合包括所述目标列数据,所述偏移地址用于获取所述目标列数据;
在所述第1个列解析单元获取到所述第m行数据中的第r+t个数据分段的情况下,通过所述第1个列解析单元利用所述目标列数据的偏移地址从所述第r+t个数据分段获取所述目标列数据,其中,t为正整数。
21.根据权利要求1中所述的方法,其特征在于,
所述对所述至少部分列数据执行目标查询操作,包括:
将目标查询语句转换为连续的目标码流,其中,所述目标查询语句中携带了所述目标查询操作,所述目标码流中携带了一组运算码;
根据所述目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,得到一组比较运算器和一组逻辑运算器;
通过所述一组比较运算器和所述一组逻辑运算器对所述至少部分列数据执行所述目标查询操作。
22.根据权利要求21中所述的方法,其特征在于,
所述根据所述目标码流对一组初始比较运算器和一组初始逻辑运算器进行初始化操作,得到一组比较运算器和一组逻辑运算器,包括:
在所述目标查询语句包括预设的C个比较参数、且一组运算码包括C个比较运算码的情况下,将所述C个比较参数和所述C个比较运算码所对应的C个比较运算配置至C个初始比较运算器,得到C个比较运算器,其中,所述一组初始比较运算器包括所述C个初始比较运算器,所述一组比较运算器包括所述C个比较运算器,C为大于或者等于1的正整数;
在所述一组运算码包括D个逻辑运算码的情况下,将C个比较结果和所述D个逻辑运算码所对应的逻辑运算配置至D个初始逻辑运算器,得到D个逻辑运算器,其中,所述C个比较结果是所述C个比较运算器对所述至少部分列数据并行执行C个比较操作得到的,所述一组初始逻辑运算器包括所述D个初始逻辑运算器,所述一组逻辑运算器包括所述D个逻辑运算器,D为大于或者等于1的正整数。
23.根据权利要求21所述的方法,其特征在于,
所述通过所述一组比较运算器和所述一组逻辑运算器对所述至少部分列数据执行所述目标查询操作,包括:
在所述目标查询操作包括C个比较操作和D个逻辑运算操作的情况下,通过C个比较运算器对所述至少部分列数据并行执行所述C个比较操作,得到C个比较结果,其中,C和D为大于或等于2的正整数,所述D个逻辑运算操作包括一级或多级逻辑运算操作,所述一级或多级逻辑运算操作中当前一级逻辑运算操作的结果是下一级逻辑运算的输入;
通过D个逻辑运算器对所述C个比较结果逐级执行所述D个逻辑运算操作。
24.根据权利要求1所述的方法,其特征在于,
在对所述至少部分列数据执行目标查询操作之后,所述方法还包括:
在通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作,得到目标查询结果的情况下,将所述目标查询结果写入到所述目标芯片的片外内存中。
25.一种数据库访问装置,其特征在于,
包括:
写入模块,用于将目标数据库中的目标页面中的数据写入到目标芯片中的N个RAM,其中,N为正整数,每个RAM的数据位宽为K个字节,K为2的幂次方;
第一读取模块,用于在所述目标页面包括M行数据的情况下,从所述N个RAM中读取所述M行数据中的每行数据的元信息,得到M个元信息,其中,M为正整数,所述M个元信息中的每个元信息包括所述M行数据中对应的一行数据在所述目标页面中的行起始位置和所述对应的一行数据包括的字节数量,在每个时钟周期上从所述N个RAM中并行读取的数据包括N×K个字节的数据;
确定模块,用于根据所述M个元信息,确定M个拆分元信息,其中,所述M个拆分元信息中的每个拆分元信息包括所述M行数据中对应的一行数据在所述N个RAM中的存储起始位置、所述对应的一行数据包括的字节数量以及所述对应的一行数据被拆分成的数据分段的数量;
第二读取模块,用于根据所述M个拆分元信息,从所述N个RAM中并行读取所述目标页面中的数据,并以数据分段为单位依次将所述M行数据中的每行数据被拆分成的数据分段发送到解析模块,其中,在每个时钟周期上从所述N个RAM中并行读取的数据包括所述M行数据中的N×K个字节的数据,每个数据分段被设置为在一个时钟周期上发送到所述解析模块;
获取模块,用于通过所述解析模块从所述M行数据中获取至少部分列数据,并对所述至少部分列数据执行目标查询操作。
26.一种计算机可读存储介质,其特征在于,
所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序被处理器执行时实现权利要求1至24任一项中所述的方法的步骤。
27.一种电子设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,
所述处理器执行所述计算机程序时实现权利要求1至24任一项中所述的方法的步骤。
CN202311855864.7A 2023-12-29 2023-12-29 数据库访问方法及装置、存储介质和电子设备 Active CN117493386B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311855864.7A CN117493386B (zh) 2023-12-29 2023-12-29 数据库访问方法及装置、存储介质和电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311855864.7A CN117493386B (zh) 2023-12-29 2023-12-29 数据库访问方法及装置、存储介质和电子设备

Publications (2)

Publication Number Publication Date
CN117493386A CN117493386A (zh) 2024-02-02
CN117493386B true CN117493386B (zh) 2024-03-01

Family

ID=89669369

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311855864.7A Active CN117493386B (zh) 2023-12-29 2023-12-29 数据库访问方法及装置、存储介质和电子设备

Country Status (1)

Country Link
CN (1) CN117493386B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6178530B1 (en) * 1998-04-24 2001-01-23 Lucent Technologies Inc. Addressing scheme for convolutional interleaver/de-interleaver
CN114647635A (zh) * 2022-03-31 2022-06-21 苏州浪潮智能科技有限公司 数据处理系统
CN117312256A (zh) * 2023-11-29 2023-12-29 苏州元脑智能科技有限公司 文件系统、操作系统和电子设备

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6178530B1 (en) * 1998-04-24 2001-01-23 Lucent Technologies Inc. Addressing scheme for convolutional interleaver/de-interleaver
CN114647635A (zh) * 2022-03-31 2022-06-21 苏州浪潮智能科技有限公司 数据处理系统
CN117312256A (zh) * 2023-11-29 2023-12-29 苏州元脑智能科技有限公司 文件系统、操作系统和电子设备

Also Published As

Publication number Publication date
CN117493386A (zh) 2024-02-02

Similar Documents

Publication Publication Date Title
US11741014B2 (en) Methods and systems for handling data received by a state machine engine
Johnson et al. Billion-scale similarity search with GPUs
US11706020B2 (en) Circuit and method for overcoming memory bottleneck of ASIC-resistant cryptographic algorithms
US7924183B2 (en) Method and system for reducing required storage during decompression of a compressed file
US8838577B2 (en) Accelerated row decompression
Qiao et al. High-throughput lossless compression on tightly coupled CPU-FPGA platforms
Andrzejewski et al. GPU-WAH: Applying GPUs to compressing bitmap indexes with word aligned hybrid
US11791838B2 (en) Near-storage acceleration of dictionary decoding
CN114647635B (zh) 数据处理系统
CN115438114B (zh) 存储格式转换方法、系统、装置、电子设备及存储介质
JP2021510987A (ja) 符号化方法、復号方法、および装置
US9137336B1 (en) Data compression techniques
CN114139040A (zh) 一种数据存储及查询方法、装置、设备及可读存储介质
CN103995827A (zh) MapReduce计算框架中的高性能排序方法
EP3718023A1 (en) Accelerated filtering, grouping and aggregation in a database system
CN105830160B (zh) 用于将经屏蔽数据写入到缓冲器的设备及方法
CN117493386B (zh) 数据库访问方法及装置、存储介质和电子设备
US20230385258A1 (en) Dynamic random access memory-based content-addressable memory (dram-cam) architecture for exact pattern matching
US9455742B2 (en) Compression ratio for a compression engine
US12001237B2 (en) Pattern-based cache block compression
US12001427B2 (en) Systems, methods, and devices for acceleration of merge join operations
WO2015143708A1 (zh) 后缀数组的构造方法及装置
Pibiri Fast and compact set intersection through recursive universe partitioning
Ali et al. A bandwidth in-sensitive low stall sparse matrix vector multiplication architecture on reconfigurable fpga platform
CN111079935B (zh) 一种spark下的机器学习快速大规模样本签名方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant