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

uyto3xhc  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(406)

此查询涉及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亿行。
有什么想法吗?任何暗示都将不胜感激。

mec1mxoz

mec1mxoz1#

我的第一个想法是去掉 order by 用于创建最终表的上一个查询中的子句。考虑到数据不会按顺序读取,因此您不会从中获得任何收益,因此此操作非常昂贵,而且不会增加任何价值。
可能还有其他方法来实现同一个查询,如果您可以解释您试图解决的问题,而不是用来解决问题的查询,这将非常有用。

相关问题