11.大数据量时,怎样让全局count/sum distinct更快?
以下两个SQL,有人可能认为例句1快于例句2。
例句1:
SELECT
COUNT(DISTINCT uin) login_uins
FROM
tabled
WHERE
ftime >= 20121001
AND ftime <= 20121001
例句2:
SELECT
COUNT(uin) login_uins
FROM
( select distinct uin from tabled WHERE
ftime >= 20121001
AND ftime <= 20121001 ) subq
实际上,例句2远远快于例句1。元芳,你怎么看?
例句1虽然只有1个mr,但是,这个mr却只有1个reduce任务,导致这个reduce任务需要读取和处理大量的数据,这不仅导致执行慢,而且,在如果tabled中的数据量太大,可能导致执行reduce任务的节点down掉。
例句2先去重,后全局统计,没有像例句1那样明显的瓶颈。所以,请牢记当对某个数据集进行全局count distinct操作时,尽量用例句2的形式。
在其他情况下,即使有group by,但是group by的维度太低,也可以考虑这种改写方法。也就是说,一定要避免group by的维度太低。