具体实施方式
下文中将结合附图对本申请的实施例进行详细说明。
目前的大规模SQL数据库均使用分布式架构,而针对分布式架构的数据库的查询,仅使用CPU已经无法满足大规模的查询需求,因此引入CPU+GPU的混合查询架构,提高数据库的查询速度。图1为CPU和GPU混合架构示意图,如图1所示,CPU针对分布式架构的多个数据库节点(DB1、DB2、DB3、DB4)进行查询,CPU将各数据库节点的数据读取到内存中,并通过查询条件进行查询。当CPU的计算力无法满足查询需求时,CPU通过GPU路由器将查询任务下发给多个GPU线程,利用GPU的强大计算能力,解决CPU的计算能力不足的问题。但是采用GPU对分布式数据库节点进行查询计算,仍然需要CPU进行数据库结果集的分类和汇聚,而如何提高结果集的分类和查询结果的汇聚速度,是提高数据库查询速度的瓶颈。
图2为一实施例提供的一种数据库查询方法的流程图,如图2所示,本实施例提供的方法包括如下步骤。
步骤S2010,接收客户端对于分布式数据库的数据查询请求。
本实施例提供的数据库查询方法应用于对数据库进行查询的单机***,在单机***中至少包括一个CPU和一个GPU。其中CPU负责对单机***中的各种计算和处理流程进行处理,GPU负责进行与图形和显示相关的处理。CPU和GPU分别有对应的存储单元,其中CPU需要处理的数据存储在内存中,GPU需要处理的数据存储在显存中。在应用CPU+GPU的混合架构进行数据库查询时,在接收到客户针对数据库的查询请求后,首先需要由CPU将数据库中的数据复制到内存中,然后再由CPU将内存中的数据写入显存中后通知GPU执行查询算法,得到查询结果。GPU查询得到的结果需要返回CPU后再通知客户。但是CPU将需要查询的数据从内存复制到显存的过程,需要占用大量的资源。
在本实施例中,提供一种数据库查询方法。首先,将需要到数据库进行查询的网元或程序称为查询客户端(Client),在单机***中设置查询代理(Proxy),Proxy负责进行查询资源的分配和查询结果的汇总,并与Client进行交互。Proxy运行于CPU中,Proxy与分布式数据库节点(Database,DB)和GPU进行交互,从DB中读取所需查询的数据,并调用GPU的资源进行查询处理。当需要对数据库进行查询时,客户端向Proxy发送数据查询请求。数据查询请求是客户端对于分布式数据库发送的对数据进行查询的请求。
步骤S2020,从分布式数据库获取数据查询请求对应的结果集。
当从客户端接收到数据查询请求后,首先需要从分布式数据库中获取数据查询请求对应的结果集。结果集是对象包含符合SQL语句中条件的所有行集合,也就是从分布式数据库的各节点中获取符合数据查询请求中条件的所有数据集合。对结果集执行数据查询请求对应的查询,即可得到数据查询结果。Proxy将从分布式数据库获取的结果集存储在CPU对应的内存中。
步骤S2030,根据预设的结果集大小阈值,判断结果集为大结果集或小结果集。
在不使用GPU进行查询的***中,当从分布式数据库获取结果集后,CPU将针对内存中存储的结果集执行数据查询请求对应的查询指令,从而得到数据查询结果。而当结果集的规模很大时,CPU的处理能力将无法满足查询需求,导致查询速度较慢。而在使用CPU+GPU的混合架构进行查询时,CPU需要将内存中存储的结果集复制到GPU对应的显存中,然后通知GPU对显存中存储的结果集执行查询,然后在接收GPU返回的查询结果后进行汇总,得到数据查询结果。但是在结果集的规模较小的情况下,仍然将结果集复制到显存中进行查询,显然也将影响查询速度。
因此,在本实施例中,在获取数据查询请求对应的结果集后,首先根据预设的结果集大小阈值,对结果集的大小进行判断,判断结果集为大结果集或小结果集。若结果集大于或等于预设结果集大小阈值,则该结果集为大结果集,若结果集小于结果集大小阈值,则该结果集为小结果集。
步骤S2040,由CPU对小结果集进行查询,以及由GPU对大结果集进行查询。
在CPU+GPU混合查询架构下,CPU和GPU均可执行查询计算,但由于CPU的计算能力有限,在查询的结果集规模较大时,查询所需时间较长,因此可以将大规模结果集复制到显存中,并调用GPU进行查询计算,从而利用GPU强大的计算能力缩短查询时间。但是在结果集规模较小时,若仍然将结果集复制到显存中,那么复制结果集以及从GPU获取查询结果所需的时间将无法被忽略,而CPU的计算能力已经足以应对小结果集的查询需求,从综合查询时间看来,使用CPU对小结果集进行查询的效率将更高。因此在本实施例中,将采用CPU对小结果集进行查询,而采用GPU对大结果集进行查询。使用CPU或GPU对结果集进行查询的具体方法可以采用目前的任一种查询方法,此处将不再赘述。
在一实施例中,在由GPU对大结果集进行查询时,需要先对大结果集进行压缩后再发送给GPU进行查询。由于将结果集发送给GPU进行查询,需要首先将结果集从内存中复制到显存中,在为GPU分配查询任务进行查询,但若结果集的大小过大,那么从内存复制到显存中的数据也将过多,从而影响查询效率。因此在将大结果集复制到GPU的缓存之前,可以先将大结果集进行压缩,从而减少复制到GPU对应的显存的数据量,提高查询效率。GPU对于显存中的数据,需要进行解压,然后再进行查询计算。
在一实施例中,由GPU对大结果集进行查询,包括:由GPU的多个并行线程对大结果集进行并行查询。GPU由于具有强大的计算能力,因此在使用GPU对大结果集进行查询时,可以为GPU分配个查询任务,使GPU使用多个并行的线程同步进行查询,从而提高查询效率。
步骤S2050,向客户端发送查询结果。
在使用CPU或GPU对结果集进行查询计算后,即可将得到的查询结果反馈给查询客户端,即Client,从而完成对分布式数据库的查询。
本实施例提供的数据库查询方法,在接收客户端对于分布式数据库的数据查询请求后,首先从分布式数据库获取数据查询请求对应的结果集,然后根据预设的结果集大小阈值,判断结果集为大结果集或小结果集,从而由CPU对小结果集进行查询,以及由GPU对大结果集进行查询,最后向客户端发送查询结果,由于通过对结果集的大小进行判断后,选择CPU或GPU进行查询计算,考虑了CPU和GPU的特点,使得采用CPU+GPU的混合查询架构对分布式数据库进行查询时,提高了查询效率,缩短了查询所需时间。
图3为一实施例提供的一种数据库查询方法的交互流程图,如图3所示,本实施例提供的方法包括如下步骤。
步骤S3010,主机端Proxy接收Client发送的查询请求。
步骤S3020,主机端Proxy获取到分布式数据库节点的结果集。
步骤S3030,根据配置的结果集阈值,判断结果集的大小。
步骤S3040,若结果集小于阈值,则判断为小结果集,由CPU处理并返回Client。
步骤S3050,若结果集小于阈值,则判断为大结果集,将结果集分配到指定GPU处理。
步骤S3060,GPU执行数据的并行查询,并将结果返回Proxy,
步骤S3070,Proxy将查询结果返回客户端。
Proxy在确定获取到的数据集为大数据集后,将指示GPU进行查询处理,而指示GPU进行查询处理的具体流程例如可以采用图4所示的处理流程。图4为一实施例提供的一种数据库查询方法的流程图,如图4所示,本实施例提供的方法包括如下步骤。
步骤S4010,分配主机端的基本变量并赋予初始值。
步骤S4020,利用CudaMalloc在GPU上分配空间。
步骤S4030,利用CudaMemcpy将主机端的数据拷贝到GPU端。
步骤S4040,调用kernal函数正在GPU上进行计算。
步骤S4050,将GPU端的查询结果拷贝回到主机端,并返回查询结果。
统一计算设备架构(Compute Unified Device Architecture,CUDA)是显卡厂商NVIDIA推出的运算平台。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。CUDA包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员可以使用各种编程语言来为CUDA架构编写程序。图4所示实施例通过CUDA编程,调用GPU执行所需的查询处理。
由GPU对大结果集进行查询,包括两类查询场景:范围查询和分组查询。其中范围查询先利用稀疏索引筛选不在范围内的数据,减少内存和显存之间拷贝数据量。分组查找通过对拆分数据段分别执行查询操作,然后通过结果集或操作,获取最终查询结果。下面分别对分为查询和分组查询进行详细说明。
范围查询的具体地方法包括如下步骤:
1、对数据量很大的每列切分成若干段,划分后的各个段保留最大值Max和最小值Min;
2、通过判断查询条件中字段与段中Max/Min关系:
2.1查询字段全部都在(Min,Max)之间:拷贝该数据段的数据到显存;
2.2查询字段全部都不在(Min,Max):丢弃该数据段的所有数据,不拷贝到显存;
2.3查询字段部分在(Min,Max):拷贝该数据段的数据到显存;
3、CUDA程序通过内置变量指定一个线程对应拷贝到显存的每个数据段,如果满足条件,则置对应位置为1,否则置为0;
4、将各个段的结果集进行合并处理;
5、只需要保留对应的结果向量,拷贝显存结果到主机内存。
图5为一实施例提供的一种数据库查询方法中范围查询的流程图,如图5所示,本实施例提供的方法包括如下步骤。
步骤S5010,将大结果集切分为多个数据段。
步骤S5020,获取每个数据段的最大值(Max)和最小值(Min)。
步骤S5030,获取数据查询请求中的查询条件。
步骤S5040,判断每个数据段的最大值和最小值是否满足数据查询请求的查询条件。
步骤S5050,若查询字段符合查询条件,即在(Min,Max)之间,则继续判断查询字段是否全部符合查询条件。
步骤S5060,若查询字段全部在(Min,Max)之间,则拷贝该段数据到显存。
步骤S5070,若查询字段部分在(Min,Max)之间,则拷贝该段数据到显存。
步骤S5080,若查询字段全部不在(Min,Max)之间,则丢弃该段数据,不进行拷贝。
步骤S5090,对显存中的数据进行并行查询计算。
步骤S5100,合并并行查询查询得到的多个查询结果。最终只需要保留对应的结果向量,拷贝显存结果到主机内存。
范围查询的具体地方法包括如下步骤:
1、假设某一结果集较大的列被拆分为长度为n的A和B两个数据段;
2、对于主机端长度为n数据段A,在GPU端初始化一个长度为n的向量A',A与A'均初始化为0;
3、在GPU计算单元申请多个线程,执行查询操作:
3.1将结果存入之前申请的向量A'中;
3.2对列B同样执行1,2操作,将结果存入到向量B';
3.3执行R=A'||B',R向量即对应原来数据段的查询结果;
4、将最终结果在GPU执行合并去重;
5、将去重后结果集拷贝回主机内存。
图6为一实施例提供的一种数据库查询方法中分组查询的流程图,如图6所示,本实施例提供的方法包括如下步骤。
步骤S6010,初始化向量。
步骤S6020,判断数据是否有效,若有效则执行步骤S6030。
步骤S6030,主机端初始化向量A。
步骤S6040,在GPU端初始化向量A'。
步骤S6050,GPU申请线程对向量A'进行并行计算。
步骤S6060,将查询结果存入A'。
步骤S6070,主机端初始化向量B,并执行步骤S6020,判断数据是否有效。
步骤S6080,当数据无效,也即查询结束,执行R=A'||B',R向量即对应原来数据段的查询结果。
步骤S6090,合并结果集并去重。
图7为一实施例提供的一种数据库查询装置的结构示意图,如图7所示,本实施例提供的数据库查询装置包括:
请求接收模块71,设置为接收客户端对于分布式数据库的数据查询请求;结果集获取模块72,设置为从分布式数据库获取数据查询请求对应的结果集;判断模块73,设置为根据预设的结果集大小阈值,判断结果集为大结果集或小结果集;处理模块74,设置为由CPU对小结果集进行查询,以及由GPU对大结果集进行查询;发送模块75,设置为向客户端发送查询结果。
本实施例提供的数据库查询装置用于实现图2所示实施例的数据库查询方法,本实施例提供的数据库查询装置实现原理和技术效果类似,此处不再赘述。
图8为一实施例提供的一种数据库查询设备的结构示意图,如图8所示,该数据库查询设备包括处理器81、存储器82、发送器83和接收器84;数据库查询设备中处理器81的数量可以是一个或多个,图8中以一个处理器81为例;数据库查询设备中的处理器81和存储器82、发送器83和接收器84;可以通过总线或其他方式连接,图8中以通过总线连接为例。处理器81包括CPU和GPU的组合,相应地,存储器82可以包括内存和显存的组合。
存储器82作为一种计算机可读存储介质,可设置为存储软件程序、计算机可执行程序以及模块,如本申请图2-图5实施例中的数据库查询方法对应的程序指令/模块(例如,数据库查询装置中的请求接收模块71、结果集获取模块72、判断模块73、处理模块74、发送模块75)。处理器81通过运行存储在存储器82中的软件程序、指令以及模块,从而完成数据库查询设备至少一种功能应用以及数据处理,即实现上述的数据库查询方法。
存储器82可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序;存储数据区可存储根据数据库查询设备的使用所创建的数据等。此外,存储器82可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。
发送器83为能够通过任一种有线或无线网络向分布式数据库节点发送数据的模块或器件组合。接收器84为通过任一种有线或无线网络接收分布式数据库节点发送的数据的模块或器件组合。
本申请实施例还提供一种包含计算机可执行指令的存储介质,计算机可执行指令在由计算机处理器执行时用于执行一种数据库查询方法,该方法包括:接收客户端对于分布式数据库的数据查询请求;从分布式数据库获取数据查询请求对应的结果集;根据预设的结果集大小阈值,判断结果集为大结果集或小结果集;由CPU对小结果集进行查询,以及由GPU对大结果集进行查询;向客户端发送查询结果。
以上仅为本申请的示例性实施例而已,并非用于限定本申请的保护范围。
本领域内的技术人员应明白,术语用户终端涵盖任何适合类型的无线用户设备,例如移动电话、便携数据处理装置、便携网络浏览器或车载移动台。
一般来说,本申请的多种实施例可以在硬件或专用电路、软件、逻辑或其任何组合中实现。例如,一些方面可以被实现在硬件中,而其它方面可以被实现在可以被控制器、微处理器或其它计算装置执行的固件或软件中,尽管本申请不限于此。
本申请的实施例可以通过移动装置的数据处理器执行计算机程序指令来实现,例如在处理器实体中,或者通过硬件,或者通过软件和硬件的组合。计算机程序指令可以是汇编指令、指令集架构((Instruction Set Architecture,ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码。
本申请附图中的任何逻辑流程的框图可以表示程序步骤,或者可以表示相互连接的逻辑电路、模块和功能,或者可以表示程序步骤与逻辑电路、模块和功能的组合。计算机程序可以存储在存储器上。存储器可以具有任何适合于本地技术环境的类型并且可以使用任何适合的数据存储技术实现,例如但不限于只读存储器(Read-Only Memory,ROM)、随机访问存储器(Random Access Memory,RAM)、光存储器装置和***(数码多功能光碟(Digital Video Disc,DVD)或光盘((Compact Disc,CD))等。计算机可读介质可以包括非瞬时性存储介质。数据处理器可以是任何适合于本地技术环境的类型,例如但不限于通用计算机、专用计算机、微处理器、数字信号处理器(Digital Signal Processing,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑器件(Field-Programmable Gate Array,FGPA)以及基于多核处理器架构的处理器。