有没有一种方法可以在Impala中优化此查询的性能?

时间:2018-12-10 17:23:37

标签: sql performance impala

此查询涉及4个表,耗时10.5小时才能完成:

第一步:

create table temp partitioned by (date_pull) stored as parquet as
select <fields>
from trans_ext -- this is the base table
inner join [shuffle] ac  -- fact_acc
inner join [shuffle] c  --related_acc
left join dt --trx_type 

表的行数统计:

trans_ext: 8,289,244,895 (72 partitions)
ac: 985,164,794 (1 partitions)
c: 17,496,531 (1 partition)
dt 4: 369 (1 partition)

步骤2: 从temp创建计数表h

select related_cust, count(*) as ct from temp group by related_cust;

第3步:通过内部连接count表创建最终表并应用where子句

select t.* 
from temp t
inner join [shuffle] h on h.related_cust=t.related_cust
where  t.related_cust is not null
and h.ct <=1000000
order by t.related_cust;

我在考虑如何消除计数表并直接创建最终结果?最终表大小:196亿行。

有什么想法吗?任何提示都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我的第一个想法是从用于创建最终表的最后一个查询中删除order by子句。此操作确实很昂贵,并且考虑到不会顺序读取数据,因此不会增加任何值,因此您不会从中获得任何好处。

可以使用其他方法来实现相同的查询,如果您可以解释要解决的问题而不是用于解决该问题的查询,这将很有用。