需求:统计各个活动的用券总金额和所有活动的用券总金额
原SQL语句如下(表明比较敏感,不便展示):
select active_code,SUM(rp_amount) totalReward
from xxx_xxx_xxx_xxx
group by active_code
union all
select null, SUM(rp_amount) totalReward
from xxx_xxx_xxx_xxx;
发现这是慢查询,原因在于:数据库引擎是将union all连接的两个子查询分别执行查询操作,得到两个查询结果集,再汇总成一个set。
改进:使用ROLLUP关键字,ROLLUP根据group by 后跟的字段或表达式产生多个结果集(grouping sets),结果集不仅包括各个活动用券金额统计,还包括所有活动的用券总金额。
select active_code,SUM(rp_amount) totalReward
from xxx_xxx_xxx_xxx
group by active_code with rollup;