HiveSQL实战积累_groupby&unionall与leftjoin效率比较
1.比较sql实例
分别依赖流量明细、关注明细、加购明细三张源表,加工得到店铺粒度的uv、pv、关注、加购四个指标数据。使用groupby&unionall和leftjoin两种写法得到的结果数据是一样的。
1.1 groupby&unionall
使用union all合并不同源表加工数据然后group by sum聚合到一起的sql实例:
1 | SELECT |
1.2 leftjoin
使用full join合并不同源表加工数据的sql实例:
1 | SELECT |
2.explain执行计划比较
2.1 groupby&unionall
groupby&unionall执行计划:
1 | Explain |
2.2 leftjoin
fulljoin执行计划:
1 | Explain |
3.比较结论
比较上述两个sql的执行计划,还有将fulljoin换成leftjoin或innerjoin的执行计划,可以发现groupby&unionall与各种join的执行计划都是一样的,多个unionall的sql是并行,多个left的sql也是并行的,所以在效率上其实是差不多的。
那么在实际项目中具体采用哪种写法,主要考虑的就是key的包含关系,以上述例子中的流量数据和关注数据为例:如果存在无流量但是有关注店铺,也存在有流量但是无关注店铺,而最终我们希望只要有流量或者关注其一的店铺就进入结果表,那么这种场景下使用groupby&unionall会方便快捷很多。如果我们能确认有流量店铺的范围一定完全包含了有关注店铺,那么使用groupby&unionall或者流量结果leftjoin关注结果都可以,只不过leftjoin写法会更简洁一些。