11.大數(shù)據(jù)量時(shí),怎樣讓全局count/sum distinct更快?
以下兩個(gè)SQL,有人可能認(rèn)為例句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
實(shí)際上,例句2遠(yuǎn)遠(yuǎn)快于例句1金砍。元芳局蚀,你怎么看?
例句1雖然只有1個(gè)mr恕稠,但是琅绅,這個(gè)mr卻只有1個(gè)reduce任務(wù),導(dǎo)致這個(gè)reduce任務(wù)需要讀取和處理大量的數(shù)據(jù)谱俭,這不僅導(dǎo)致執(zhí)行慢奉件,而且宵蛀,在如果tabled中的數(shù)據(jù)量太大昆著,可能導(dǎo)致執(zhí)行reduce任務(wù)的節(jié)點(diǎn)down掉。
例句2先去重,后全局統(tǒng)計(jì)术陶,沒(méi)有像例句1那樣明顯的瓶頸凑懂。所以,請(qǐng)牢記當(dāng)對(duì)某個(gè)數(shù)據(jù)集進(jìn)行全局count distinct操作時(shí)梧宫,盡量用例句2的形式接谨。
在其他情況下,即使有g(shù)roup by塘匣,但是group by的維度太低脓豪,也可以考慮這種改寫(xiě)方法。也就是說(shuō)忌卤,一定要避免group by的維度太低扫夜。