海量数据的表避避免全表扫描,否则导致系统宕机

INSERT OVERWRITE  DIRECTORY '/abc/def/gk' ROW FORMAT delimited fields terminatd by '\t' stored as textfile 
select * from
  dtw.dtw_dwd_property_work_order_target_d t1
left SEMI join(
  select order_id from
    (   select order_id,count(*) as cnt from dtw.dtw_dwd_property_work_order_target_d
    where ds='20180607' group by order_id
    ) t   where cnt>1 ) t2
on t1.order_id=t2.order_id

sql实现的功能:一条工单包含多条数据的这类工单全部导出

上述sql中, dtw_dwd_property_work_order_target_d是一个包括所有历史时间分区数据的表格,非常庞大。

紫色sql中,指明的具体的时间分区,查询结果存放在t表中,结果不算大;

黄色sql中,从t表中查询id,带有where条件,结果存放在t2表中,也不算大;

红色字体的sql,其中,dtw.dtw_dwd_property_work_order_target_d t1 没有指定时间分区,则会扫描该表所有历史时间分区数据,并且缓存到集群系统盘,最终将系统盘撑爆,宕机。

为了实现上述功能,sql可以简化为:

     select order_id from dtw.dtw_dwd_property_work_order_target_d 
    where ds='20180607'
    group by order_id
    having count(1) > 1;

猜你喜欢

转载自www.cnblogs.com/wooluwalker/p/9197155.html