之前一篇针对单个count(distinct xxx)的优化,本文来讲讲对多个count(distinct xxx)的优化。
0x00 解决思路
优化是在之前单个count的基础上,通过使用union all以及窗口分析函数lag的结合来进行的。具体思路如下。
0x01 分治法
1 | SELECT |
- 此方法适用于求少量count distinct的情况,有多少个count distinct就union all多少次。
- 在最内层t1、t2中分别求得需要的计数值。
- 在中间层t3使用窗口分析函数lag或者lead(或者使用max方法也行)对多个结果值进行聚合。
- 在最外层t4通过row_number筛选出需要行。
经过验证,该方法在5000万数据量的情况下,不优化需要4.5分钟,经过优化需要1.5分钟,提升效果较为明显。
0x10 随机分组法
1 | SELECT |
经过验证,该方法在5000万数据量的情况下,不优化需要4.5分钟,经过优化需要40秒,效果更加明显。