如果SQL语句中有group by并且group by列中不包含hash分布列时,集群计划默认使用两阶段group by,即先在各个节点上做group by,做hash重分布,然后再做一次group by。
如果两阶段group by的第一阶段无法有效缩减结果集,即group by后结果集变化不大,在结果集数据量仍然很大的情况下,第一遍的group by就基本上相当于白做了。
比如查询,select count(*) from tab group by id2,id2非表tab的hash分布列,默认执行计划如下:
Step1: select id2 as c1, count(0) as c2 from tab group by id2 into table temp1(按id2 hash重分布)
Step2: select sum(c2) from temp1 group by c1。
针对Step1 group by无法有效缩减结果集时,group by会没有意义,而且会增加计算负担,可以通过设置参数gcluster_delayed_group_by_optimize为1,开启延迟group by优化。
开启延迟group by优化后,第一步在各个节点上的group by就不做了,直接做hash重分布,然后再在各个节点上做group by,这样就可以省掉第一遍group by的耗时。
开启延迟group by优化后,SQL将按如下计划执行:
Step1: select id2 as c1 from tab into table temp1(按id2 hash重分布)
Step2: select count(*) from temp1 group by c1。