南大通用GBase 8a 动态hash重分布join策略

54 阅读2分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

应用执行的SQL语句中2个表进行Join操作,该2张表的关联列有一个为分布表的hash分布列或都不是hash分布列,并且关联方式为等值关联,则GCluster将关联列不是hash列的表的数据在节点间进行hash重分布,然后再进行local join。以下以两表关联列均不是hash分布列举例。
应用进行查询,查询语句为: SELECT uid,name FROM T1 JOIN T2 ON T1.gid=T2.gid WHERE uid=10;
在数据库中的表结构为:

该查询在GBase 8a MPP Cluster执行步骤如下:
1、该查询通过GBase 8a MPP Cluster的接口层进行负载均衡后发送给Node1节点上的GCluster。
2、Node1节点上的GCluster组件接收到该SQL后,进行语法解析,GCluster判断出T1,T2表关联列不是hash分布列,故GCluster需要把该SQL语句进行内部优化处理,处理过程如下:
1) 数据库创建中间临时表,根据T1表结构创建_tpt1,根据T2表结构创建_tpt2,2张表都为分布表,gid作为该中间表的hash分布列。表结构示意图如下:

2) GCluster根据hash规则,通知各个节点中的GNode先执行单表条件查询, 各个节点执行的单表条件查询的SQL语句如下:
Node1:
SELECT gid,uid FROM T1_1 WHERE uid=10;
SELECT gid,name FROM T2_1;
Node2:
SELECT gid,uid FROM T1_2 WHERE uid=10;
SELECT gid,name FROM T2_2;
Node3:
SELECT gid,uid FROM T1_3 WHERE uid=10;
SELECT gid,name FROM T2_3;
然后各节点将单表过滤后的结果数据在各节点间进行hash重分布,将对应数据传输给3个节点的_tpt1,_tpt2表。
3)_tpt1,_tpt2表数据构建完毕后,GCluster生成GNode执行的SQL语句,发送给Node1,Node2,Node3的GNode,进行local join,具体下发的SQL语句如下:
Node1:
SELECT uid,name FROM _tpt1_1 JOIN _tpt2_1 ON _tpt1_1.gid=_tpt2_1.gid WHERE uid=10;
Node2:
SELECT uid,name FROM _tpt1_2 JOIN _tpt2_2 ON _tpt1_2.gid=_tpt2_2.gid WHERE uid=10;
Node3:
SELECT uid,name FROM _tpt1_3 JOIN _tpt2_3 ON _tpt1_3.gid=_tpt2_3.gid WHERE uid=10;
3、Node1,Node2,Node3节点上的GNode接收到SQL后,进行执行该查询。
4、 Node1,Node2,Node3节点上的GNode把查询结果返回给Node1节点的GCluster组件,由它负责把结果返回给应用。
查询计划示意如下:

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。