首页 > 技术文章 > 对GPDB查询计划的Motion结点的理解

lanhj 2017-06-06 21:17 原文

GPDB在进行join查询时,可能会产生Motion结点
根据官方文档,总共有这几种Motion:

  1. redistribute 重分布(用hash取模的方法把join字段重分布到各个segment,相当等于生成了一张分布键为join字段的临时表)
  2. explicit redistribute 精确的重分布(待查资料)
  3. broadcast 广播(把一张表的数据全部复制到所有segmeent上,一般做小表广播)
  4. gather 汇总(汇总到master的操作,不一定有,比如create table as select语句,只需要分发数据到各个segment即可)

根据参考资料1我的理解:

  1. join两边的字段都是分布键,没有motion操作。这个很好理解,A表和B表分布键相同的值都在同一个segment上了,不需要转移数据
  2. 大表join大表,其中一个join字段是分布键,另一个不是,此时非分布键的表会被重分布。这个也好理解,广播是数据量*segment数的代价,但重分布是1个数据量的代价。重分布后, A表和B表相同值的行都在同一个segment上。
  3. 小表join大表,其中小表用了分布键,大表不用分布键,此时会广播小表。那为什么不会重分布小表呢?因为小表的join条件已经是分布键了,重分布后的数据不会改变的,所以只能对小表进行广播。而无论对大表进行重分布或广播,代价都要比广播小表高得多
  4. 小表join大表,其中小表不用分布键,大表用分布键,此时重分布小表,毫无疑问
  5. 大表join大表,其中一个不用分布键,此时重分布不使用分布键的表
  6. 两张表的join条件都不是分布键,此时重分布A表+重分布B表代价最低

参考资料:

  1. https://yq.aliyun.com/articles/60870
  2. https://yq.aliyun.com/articles/57822
  3. http://blog.sina.com.cn/s/blog_3fcc38fc010170e8.html
  4. https://gpdb.docs.pivotal.io/4320/ref_guide/sql_commands/EXPLAIN.html

推荐阅读