数据重分布介绍
重分布是计算节点之间进行数据交换,以便完成分布式数据的关联(join)操作。
datanode节点之间进行数据交换。
当datanode上面两表进行join,并且至少一张表是采用非分布key进行join时。
postgres=# explain select * from tbl_a, tbl_b where tbl_a.f1 = tbl_b.f2;
QUERY PLAN
--------------------------------------------------------------------------------------------
Remote Subquery Scan on all (db1,db2) (cost=140.38..503.73 rows=9112 width=16)
-> Hash Join (cost=140.38..503.73 rows=9112 width=16)
Hash Cond: (tbl_b.f2 = tbl_a.f1)
-> Remote Subquery Scan on all (db1,db2) (cost=100.00..141.05 rows=1350 width=8)
Distribute results by S: f2
-> Seq Scan on tbl_b (cost=0.00..23.50 rows=1350 width=8)
-> Hash (cost=23.50..23.50 rows=1350 width=8)
-> Seq Scan on tbl_a (cost=0.00..23.50 rows=1350 width=8)
(8 rows)
如上面的执行计划,a表分布key join b表非分布key在每个dn上面进行,会分别去其他dn获取b表的数据。每个dn会按照b表的join key进行计算,然后把b表数据发送到对应dn节点上面。(相当于把B表以join key为分布列,让B表的数据重新分布)
SharedQueue
SharedQueue是用来完成数据重分布的数据结构,它具有如下特点:
SharedQueue执行流程:
SharedQueue的进程交互模型如下:
DataPump是用来实际存放生产者生产数据的环形队列
三个重要的位置
SharedQueue的生产和消费
RemoteSubplan重分布函数调用流程
上层执行节点:
下层执行节点:
上下层节点交互关系如下: