首页 > 代码库 > distinct 优化

distinct 优化

当数据量非常大,在同一个query中计算多个不相关列的distinct时,往往很容易出现数据倾斜现象,导致运行半天都不能得到结果。
比如以下的SQL语句:
select distinct(a), distinct(b), distinct(c) from tableName;

a, b, c没有相关性。

改进方案:把计算的distinct先group by,然后再计算:

 

select distinct(t.a), distinct(t.b), distinct(t.c) from(	select a, b, c from tableName	group by a, b, c;)t;
原理:distinct是在reduce里面计算的,再进行merge,而group by的字段会在map这里分N路hash。group by越多,hash分的越随机。

distinct 优化