假设需要两张表A,B关联,其中A表中关联键不是分布键,那么对于a表而言就会发生如下两种情况
1 广播
2 重分布
分布式的关联有两种
单库关联:分布键和关联键一致,只需要在单个库关联后得到结果即可
跨库关联:关联键和分布键不一致,数据重新分布,转换为单库关联,从而实现表的关联
测试表
表名 | 字段 | 分布键 | 数量 |
A | ID1,ID2 | ID1 | M |
B | ID1,ID2 | ID1 | N |
考虑几种连接方式
内连接
1、分布键与关联键一致,单库连接
SELECT * FROM A,B WHERE A.ID1=B.ID1;
2、一张表的分布键与关联键不一致
SELECT * FROM A,B WHERE A.ID1 = B.ID2;
首先第一点b表分布键与关联键不一致
考虑 将 b 表按照 id2 重分布一遍则数据量为N
(其实还可以将b表广播z份,数据量为N*z,所以就可以判断出,b表最多重分布)
将a广播z份,则数据为M*z
就是要比较两者产生的数据量大小,如果b大,则让a广播,如果b小,则rang b重分布
3、两张表的分布键与关联键不一致
select * from a,b where a.id2=b.id2;
重分布: M+ N
某个广播 min(M,N)*Z
同样比较两者的大小
左连接
1、分布键与关联键一致,单库连接
2、一张表的分布键与关联键不一致
select * from a left join b on a.id1=b.id2;
左边不能广播,而且左表关联键为分布键,那么对于这个连接,只能是b表操作,b表重分布为N,b表广播为N*z
数据量为N
select * from a left join b on a.id2=b.id;
左连接,左表不能被广播,那么
1、a表重分布 M
2、将b表广播,n*z
3、两张表的分布键与关联键不一致
select * from a left join b on a.id2=b.id2;
还有两种方式
将表A与表B都按照id2字段将数据重分布一遍,数据量M+N
表A不能广播,只能将B,代价为N*z
全连接
1、关联键为分布键,单库连接
select * from a full outer join b where a.id=b.id;
2、一张表的分布键与关联键不一致
select * from a full outer join b where a.id=b.id2;
两者都不能被广播,那么只能为重分布
只能为 N
3、select * from a full outer join b where a.id2=b.id2;
将两张表重分布 M+N