一种并行数据库中算子复用的实现方法,包括如下步骤:步骤1、使用普通的查询规划方法为查询生成串行的查询计划,所述查询计划是一个二叉树结构;步骤2、自顶向下扫描执行所述查询计划,寻找可复用的物化类算子,并更改查询计划结构,将线程级物化算子改为全局复用的物化算子;步骤3、对步骤2生成的更改后的查询计划进行并行化处理,生成用于多个线程并行执行的计划森林;步骤4、对步骤3生成的计划森林进行全局复用算子合并处理,生成用于可供多个线程并行执行且可复用物化算子的有向图计划;步骤5、各个线程并行执行所述有向图中的各自的计划部分,第一个执行到全局复用算子的线程称之为主线程,由主线程锁住该全局复用算子并真正执行该算子及其以下的计划,其他线程等待;步骤6、所述主线程执行完该算子之后解锁,其他线程开始从该全局复用算子中读取数据并继续各自的计划树;步骤7、所述主线程等待所有的计划都读取完毕全局复用算子的数据之后释放该算子物化的数据。
【技术实现步骤摘要】
本专利技术涉及一种数据库系统,尤其是涉及一种并行数据库的算子复用的实现方法。
技术介绍
随着信息技术的发展和普及,数据正在以指数速度迅速膨胀,处理海量数据越来越成为计算机领域面临的重要问题。数据库领域兴起的对0LAP、DSS、数据挖掘等的研究本质上都是对海量数据处理的研究。目前解决海量数据处理问题比较流行的技术是并行查询技术和集群技术。并行查询技术一直以来都是数据库领域的研究热点,学术界提出了多种并行查询的体系架构 Share-Everything (完全共享)架构、Share-Memory (共享内存)架构、Share-Disk (共享磁盘)架构以及 Siare-Nothing (无共享)架构。Siare-Memory 架构和 Siare-Everything 架构都会共享主存储器,进程或线程会通过内存交换数据。但是目前流行的Siare-Memory和 Share-Everything架构的并行数据库系统都是使用共享内存进行通信和数据交换,而没有利用多个并行进程或线程之间的算子复用。在基于分区的并行架构下,多个线程或进程独立的执行各自的任务,同一条查询语句的查询内并行往往是多个进程或线程执行结构几乎完全相同的语句,所不同的只是其中涉及到的部分表不同。在这种情况下,各个进程或线程都把各自的查询执行一遍,而不考虑算子的复用是对资源的极大浪费。
技术实现思路
为了解决上述问题,本专利技术提供了一种在SM架构的并行数据库中通过实现算子复用技术来提高系统的资源利用率和性能。本专利技术采用如下的技术方案步骤1、使用普通的查询规划方法,为查询生成串行的查询计划,所述查询计划是一个二叉树结构;步骤2、自顶向下扫描执行所述查询计划,寻找可复用的物化类算子,并更改查询计划结构,将线程级物化算子改为全局复用的物化算子;步骤3、对步骤2生成的更改后的查询计划进行并行化处理,生成用于多个线程并行执行的计划森林;步骤4、对步骤3生成的计划森林进行全局复用算子合并处理,生成用于可供多个线程并行执行且可复用物化算子的有向图计划;步骤5、各个线程并行执行所述有向图中的各自的计划部分,第一个执行到全局复用算子的线程称之为主线程,由主线程锁住该全局复用算子并真正执行该算子及其以下的计划,其他线程等待;步骤6、所述主线程执行完该算子之后解锁,其他线程开始从该全局复用算子中读取数据并继续各自的计划树;步骤7、所述主线程等待所有的计划都读取完毕全局复用算子的数据之后释放该算子物化的数据。本专利技术是对SM架构的并行数据库查询执行流程的优化,关键特点在于对多个线程中相同的物化算子进行共享。和普通的并行查询执行流程相比,不仅节省CPU和内存资源,还将少了 IO读取,不增加任何成本。附图说明下面结合附图和具体实施方式对本专利技术作进一步的说明。图1示出了步骤1生成的计划树结构的示意图;图2示出了步骤2的计划树结构的示意图;图3示出了步骤3的计划森林结构的示意图;图4示出了步骤4的有向图计划结构的示意图;图5示出了计划执行阶段的数据流程图。具体实施例方式下面结合附图和具体实施例对本专利技术做进一步的详细描述通过在数据库的查询优化阶段对多线程的并行计划进行扫描从中寻找可供复用的算子,将可供复用的算子修改为全局共享算子,并更改计划结构,将计划树变成计划森林,并进一步改写成有向图。通过并行执行该有向图计划,在计划执行过程中复用物化算子的中间结果。本方法主要包括以下步骤计划生成阶段步骤一使用普通的查询规划方法,为查询生成串行的查询计划,该查询计划是一个二叉树结构。其中查询涉及到分区表,因此部分叶节点是对分区表的扫描。如图1所示,某一个查询为 select*from A,B,P where A. a = B. b and A. a = P. ρ ;其中 Α、Β 不是分区表,P 为分区表,子分区为Pl,Ρ2。该计划树表明在该查询中,首先对B表创建Hash表,由A和B表通过HashJoin方式进行连接,然后对A、B的连接的结果创建Hash表,再和P表通过HashJoin 方式进行连接。步骤二自顶向下扫描执行计划,寻找可复用的物化类算子,并更改计划结构,将线程级物化算子改为全局复用的物化算子。当找到一个之后,不再继续向下扫描子树。可复用的物化算子的判断标准是如果某物化算子及其以下的计划树都不包含分区表,那么这个物化算子是可被复用的。如本例中的计划,如图2所示,自顶向下扫描计划会首先发现对A、B的连接结果创建Hash表是可复用的物化算子,因此修改该Hash算子为GlobalHash算子。虽然如果继续向下扫描会发现对B表创建Hash表也是一个可被复用的物化算子,但是因为对 B表创建Hash表是对A、B的连接结果创建Hash表的子树,我们在寻找到一个可复用算子之后停止继续向下扫描,因此对B表创建Hash表将不被复用。步骤三对步骤二生成的查询计划进行并行化处理,生成用于多个线程并行执行的计划。 具体方法是扫描计划中分区表,如果所有涉及到分区表分区方式相同,那么就可以把计划复制同分区数相同的分数,并把每个计划里的分区主表用分区子表替换,形成一个计划森林。如图3所示,本例中的分区表为P,分区数为2。因此将步骤二中的计划复制为2份,并将每个计划树中的P表分别修改为Pl和P2。步骤四对步骤三生成的计划森林进行全局复用算子合并处理,生成用于可供多个线程并行执行且可复用物化算子的有向图计划。具体方法是扫描计划森林中各个计划树,遇到全局物化算子就把各个计划树中的相同位置的全局物化算子合并成一个。如图4所示,本例中的计划森林被合并成如下有向图计划。计划执行阶段并行计划的执行实际上是多个线程并发执行,并互相进行数据传输的过程。物化算子复用技术在计划执行过程中所做的工作就是只有一个线程实际的执行了该算子以及其之下的计划,其他线程都没有执行,而只是复用了结果。具体的方法是各个线程并行执行有向图中的各自的计划部分,第一个执行到全局复用算子的线程称之为主线程,由主线程锁住该全局复用算子并真正执行该算子及其以下的计划,其他线程等待。主线程执行完该算子之后解锁,其他线程开始从该全局复用算子中读取数据并继续各自的计划树。主线程等待所有的计划都读取完毕全局复用算子的数据之后释放该算子物化的数据。本例中数据流图如图5所示。从图中可以看出,两个线程并行执行各自的Hashjoin,其中主线程要完成P1、A、B三个表的连接,而另一个线程要完成P2同A、B表的连接。但是只有主线程执行了 A与B的HashJoin以及对A、B连接结果创建Hash表,另一个线程直接从GlobalHash算子里读取数据同P2表做Hashjoin。显然,通过对算子的复用,对B表创建Hash表和对A、B 的连接结果创建Hash表的操作只做了一次,节省了内存和CPU资源;对A、B的连接操作只做了一次,节省了 CPU资源;对A、B表的数据读取只做了一次,节省了 IO资源。本专利技术是对SM架构的并行数据库查询执行流程的优化,关键特点在于对多个线程中相同的物化算子进行共享。和普通的并行查询执行流程相比,不仅节省CPU和内存资源,还将少了 IO读取,不增加任何成本。经测试,在TPC-H100G基准测试中使用算子复用技术可将CPU资源使用率降低16%,内存使用降低32%本文档来自技高网...
【技术保护点】
1.一种并行数据库中算子复用的实现方法,包括如下步骤:步骤1、使用普通的查询规划方法,为查询生成串行的查询计划,所述查询计划是一个二叉树结构;步骤2、自顶向下扫描执行所述查询计划,寻找可复用的物化类算子,并更改查询计划结构,将线程级物化算子改为全局复用的物化算子;步骤3、对步骤2生成的更改后的查询计划进行并行化处理,生成用于多个线程并行执行的计划森林;步骤4、对步骤3生成的计划森林进行全局复用算子合并处理,生成用于可供多个线程并行执行且可复用物化算子的有向图计划;步骤5、各个线程并行执行所述有向图中的各自的计划部分,第一个执行到全局复用算子的线程称之为主线程,由主线程锁住该全局复用算子并真正执行该算子及其以下的计划,其他线程等待;步骤6、所述主线程执行完该算子之后解锁,其他线程开始从该全局复用算子中读取数据并继续各自的计划树;步骤7、所述主线程等待所有的计划都读取完毕全局复用算子的数据之后释放该算子物化的数据。
【技术特征摘要】
【专利技术属性】
技术研发人员:李阳,何清法,顾云苏,冯柯,蒋志勇,徐岩,饶路,李晓鹏,刘荣,赵婧,
申请(专利权)人:天津神舟通用数据技术有限公司,
类型:发明
国别省市:12
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。