SMB = Sort Merge Bucket
应对大表join大表
目的
大表化为小表
手段
相同key的数据在同一个桶里,join操作时,无需扫描无关项
步骤
1、按key排序
2、按照key进行hash,进行分桶
使用条件
1、两表的桶个数必须相等,按照相同规则hash分桶
2、两表进行join时,join列 == 排序列 == 分桶列
举例
优化前
代码
执行计划
sort花费分别为5.8s和4.2s
优化后
先分桶
代码
执行计划
sort花费分别为2.8s和2.1s.
对比
排序时间
这里两个表数据量分别为2G和4G,比较小,分桶仅为5个,效果差异不是特别明显,如果是上T数据,分桶较多,排序时间缩短效果会更明显。
生成文件个数
未分桶:36个(36个并行度)
分桶:5个(5个桶)