GPDB在进行join查询时,可能会产生Motion结点
根据官方文档,总共有这几种Motion:
- redistribute 重分布(用hash取模的方法把join字段重分布到各个segment,相当等于生成了一张分布键为join字段的临时表)
- explicit redistribute 精确的重分布(待查资料)
- broadcast 广播(把一张表的数据全部复制到所有segmeent上,一般做小表广播)
- gather 汇总(汇总到master的操作,不一定有,比如create table as select语句,只需要分发数据到各个segment即可)
根据参考资料1我的理解:
- join两边的字段都是分布键,没有motion操作。这个很好理解,A表和B表分布键相同的值都在同一个segment上了,不需要转移数据
- 大表join大表,其中一个join字段是分布键,另一个不是,此时非分布键的表会被重分布。这个也好理解,广播是
数据量*segment数
的代价,但重分布是1个数据量的代价。重分布后, A表和B表相同值的行都在同一个segment上。 - 小表join大表,其中小表用了分布键,大表不用分布键,此时会广播小表。那为什么不会重分布小表呢?因为小表的join条件已经是分布键了,重分布后的数据不会改变的,所以只能对小表进行广播。而无论对大表进行重分布或广播,代价都要比广播小表高得多
- 小表join大表,其中小表不用分布键,大表用分布键,此时重分布小表,毫无疑问
- 大表join大表,其中一个不用分布键,此时重分布不使用分布键的表
- 两张表的join条件都不是分布键,此时重分布A表+重分布B表代价最低
参考资料: