TeleDB支持两级并行,从而实现高效的并行计算能力。两级并行分别为多节点之间的并行和节点内的并行。
- 多节点之间并行执行:分布式事务需要多节点一起完成。多个节点之间是并行的,例如:所有DDL语句,涉及元数据变更,需在所有CN、DN节点上执行。批量INSERT语句、不带分布键的SELECT、UPDATE、DELETE语句,需在所有DN节点上执行。
- 节点内基于数据页的并行计算:对于大表查询,为充分利用服务器多核处理能力,在节点内同时启动多个进程并行计算,协同完成一个任务。
说明TeleDB支持设置参数,通过参数来显示表的大小。当表的数据量超过一定阈值时,会启用并行。当需要并行计算的时候,优化器会根据表大小得出并行度,启动多个进程并行执行。如果有更多的资源,执行速度可以根据并行度实现线性扩展。
实际使用中常见的是join关联,和aggregate数据汇聚(也就是group by),下面以hash join和aggreagte为例,介绍TeleDB的并行计算能力。
- hash join
仍以TBL_A关联TBL_B表查询为例,两表大小相当时,优化器会优先选择hash join方式关联,流程如下:
- 获取TBL_B表所有数据。
- TBL_B表的每一行计算哈希值,构建一张哈希表。
- 访问TBL_A表每一行数据。
- TBL_A表每一行计算哈希值。
- TBL_A表每一行哈希值,匹配哈希表,得到匹配结果。
- 并行hash join
对于大表关联,优化器根据资源估算,可以启动多个进程,并行扫描数据,然后并行hash join,流程如下:
- 多个进程并行访问TBL_B表的一部分数据。
- 每个进程各自构建一张哈希表。
- 合并所有进程的哈希表,构建出一张共享哈希表。
- 多个进程并行访问TBL_A表的一部分数据。
- 多个进程并行计算出TBL_A表每一行的哈希值。
- 多个进程并行匹配共享哈希表,得到匹配结果。
相比没有开启并行hash join的查询,并行hash join的性能提升,主要有并行扫描和并行hash join,而在构建哈希表和哈希表匹配部分的并行计算能力,可以让查询性能随着并行度的提升而提升。
- aggregate汇聚计算
例如:TBL_A表的简单sum、avg等汇聚计算。
左图为没有开启并行时的执行流程,只需要查询、汇聚两步。
- 并行aggregate汇聚计算
右图为开启并行后的执行流程,流程如下:
- 多个进程并行访问TBL_A表的一部分数据。
- 多个进程并行计算aggregate,得到一个中间结果。
- 所有中间结果进行一次数据重分布,将相同group by汇聚列的数据分布在同一个进程中。
- 多个进程并行再做一次最终的aggregate,然后汇总,得到汇聚结果。