博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]Greenplum 执行计划之广播与重分布
阅读量:5088 次
发布时间:2019-06-13

本文共 1817 字,大约阅读时间需要 6 分钟。

关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的。关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移。数据迁移有广播和重分布两种。在GP中,每一个广播或重分布会产生一个切片,每一个切片在每个数据节点上都会对应发起一个进程来处理该slice负责的数据,上一层负责该slice的进程会读取下级slice广播或重分布的数据,然后进行相应的计算。

当两张表关联的时候,如果有一张表的关联键不是分布键,那么就会发生表的广播或者重分布,将数据移动到一个节点上进行关联,从而获得数据。

分布式的关联有两种:
单库关联:关联键与分布键一致,只需要但单个库关联后得到结果即可。
跨库关联:关联键与分布键不一致,数据需要重新分布。转换成单库关联,从而实现表的关联。

表关系如下:

表A

字段:id,id2
分布键:id
数据量:M

表B

字段:id,id2
分布键:id
数据量:N

内连接

情况1:

select * from A,B where A.id=B.id;

分布键与关联键相同,属于单库关联,不会造成广播或者重分布。

情况2:

select * from A,B where A.id=B.id2;

表A的关联键是分布键,表B的关联键不是分布键,那么可以通过两种凡是来实现关联。
1. 将表B按照id2字段将数据重分布到一个节点上,然后再与表A进行关联。重分布的数据量是N。
2. 将表A广播,每一个节点都放一份全量数据,然后再与表B关联得到结果。广播的数据量是M*节点数。
所以,当N>M*节点数的时候,选择表A广播,否则选择B重分布。

情况3:

select * from A,B where A.id2=B.id2;

两个表的关联键与分布键都不一样,那么还有两种做法:
1. 将表A与表B按照id2字段,将数据重分布到每个节点,重分布的代价是M+N。
2. 将其中一张表广播后再关联,当然选取小表广播,代价小。广播的代价是min(M,N)*节点数。
所以当M+N>min(M,N)*节点数的时候,选择小表广播,否则选择两个表都重分布。

左连接

情况1:

select * from A left join B on A.id=B.id;

单库关联,不涉及数据库跨库关联。

情况2:

select * from A left join B on A.id=B.id2;

由于左表的分布键是关联键,鉴于左连接的性质,无论表B数据量多大,都必须将表B按照字段id2重分布数据。

情况3:

select * from A left join B on A.id2=B.id;

左表的关联键不是分布键,由于左连接A表肯定不是被广播的,所以有两种方式。
1. 将表A按照id2重分布数据,转换成情况A,代价为M。
2. 将表B广播,代价为N*节点数。

情况4:

select * from A left join B on A.id2=B.id2;

有两种处理方式。
1. 将表A与表B都按照id2字段将数据重分布一遍以,转换成情况1,代价是M+N。
2. 表A不能被广播,只能将表B广播,代价是N*节点数。

全连接

情况1:

select * from A full outer join B on A.id=B.id;

关联键是分布键,在GP中全连接只能采用Merge Join来实现。

情况2:

select * from A full outer join B on A.id=B.id2;

将不是关联键不是分布键的表重分布数据,转换成情况1解决。无论A、B大小分别为多少,为了实现全连接,不能讲表广播,只能是重分布。

情况3:

select * from A full outer join B on A.id2=B.id2;

将两张表都重分布,转换成情况1进行处理。

《Greenplum企业应用实战》

(原文地址:http://www.jpblog.cn/greenplum-%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92%E4%B9%8B%E5%B9%BF%E6%92%AD%E4%B8%8E%E9%87%8D%E5%88%86%E5%B8%83.html)

转载于:https://www.cnblogs.com/jianyungsun/p/8531907.html

你可能感兴趣的文章
python学习笔记-17 返回函数
查看>>
运行npm run eject报错解决方法
查看>>
php接入支付宝的流程(转载)
查看>>
简单请求和非简单请求
查看>>
ubuntu必备软件安装
查看>>
心得1--js加强dom介绍与node使用
查看>>
js计算时间差
查看>>
ROS学习笔记十:URDF详解
查看>>
软件测试计划
查看>>
IOS Audio开发集合
查看>>
mysql并发控制之快照读和当前读
查看>>
DirectX11 With Windows SDK--27 计算着色器:双调排序
查看>>
POJ1456 Supermarket
查看>>
Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
查看>>
jQuery $.each的使用方法
查看>>
leetcode 198-234 easy
查看>>
Matlab中给figure添加图例(legend),标题(title)和颜色(color)...
查看>>
window.location详解
查看>>
UVALive-3989 Ladies' Choice (稳定婚姻问题)
查看>>
CC2430基础——串口代码分析
查看>>