一,相关分析
通常当聚合率和数据量没有大于一定程度时,对于不涉及Rollup,Cube,Grouping_Sets这三中操作的聚合很少出现GC问题。对于Rollup,Cube,Groupubg_sets操作客采用如下方法避免GC。
Rollup / Cube / Grouping_Sets时,某些场景下,如果多维度的字段比较多内存或者GC会造成性能问题。特别周四实现这三种操作时,记录数会出现倍数的膨胀,调优的时候请务必关注GC情况。如果GC性能表现不佳,建议用手动改动的方式调优,通常是把这三种操作等价的union多个子查询SQL的方式实现。对SQL改写相当于是对它们计算内容的同语义翻译
1.Rollup改写
对它等价的拆分改写结果如下,上下两个语句的结果相同:
2.Cube改写
可以看出前三个的Union的结果等同于一个 Rollup ,所以还可以改写为
3.Grouping Sets的改写
对它等价的拆分改写结果如下,上下两个语句的结果相同:
总结:可以按照以上所示的对三种操作的改写形式对语句展开优化,尽可能的减少因内存和GC引发的性能问题。但是,一般情况下,如果GC问题不是特别严重,就不用改写,否则会导致性能更差。