HAWQ 中的查询计划可以拆分为多个可以独立运行的切片。HAWQ 如何将查询计划拆分为切片?
3 回答
首先,让我们澄清一下 slice 的含义。Slice是整个查询计划的子树,是一棵算子树,这些算子可以运行在同一个节点上。在同一个节点上运行意味着运行切片的节点不需要与其他节点通信进行数据交换。
所以,如果有数据交换需求,我们就拆分计划,加入运动节点。
正如@ztao 所说,有三种运动节点。
收集。一个节点需要从所有节点收集数据。通常用于在查询调度程序端运行的顶部切片。调度程序收集所有结果,执行一些操作,并将结果返回给最终用户。
播送。一个节点中的数据需要广播到所有节点。通常用于小表和大表之间的连接。我们可以将小表的数据广播到所有包含大表数据的节点,这样接下来就可以执行散列连接了。
重新分配。数据存在于多个节点中,遵循某种分配策略,需要根据新的策略重新分配数据。通常用于两个大表之间的连接,并且两个表的分布键不相同。需要重新分配一张表以确保它们都被并置。
请注意,#slices 等于 #motion 节点 +1。
当需要重新分配数据时,Motion 节点将被添加到计划中。聚合、连接、排序等功能都会生成运动节点。
例如,可以对段进行部分排序,但不同段上的数据仍然是无序的。我们必须将数据重新分配到上层切片中的一个精确段以进行合并排序。
Motion 节点(Gather/Broadcast/Redistribute)针对不同的场景添加,将查询计划拆分为不同的切片以实现并行运行。例如,有一个嵌套循环连接,它的外层孩子是一个表 A SeqScan,内层孩子是一个表 B SeqScan。在优化器代码中,它将根据成本决定在外部子节点或内部子节点中插入一个运动节点(将被广播或重新分配)。
NestLoop
/ \
/ \
SeqScan A 广播运动
|
序列扫描 B