|
相信下面两个SQL都可以满足LZ的业务逻辑要求
<第三种写法>
/home/db2inst/sql_performance/test2 > cat t3.sql
select b.cust_group_id as group_id, aa.pre_m_arpu_d,
-- sum(case when a.cust_id is not null then aa.PRE_M_ARPU end) as a1_arpu,
-- sum(case when a.cust_id is not null then cc.m end) as a1_m,
-- sum(case when a.cust_id is not null then cc.CLV end) as a1_clv,
-- sum(case when a.cust_id is not null then 1 end) as EXIST_CUST_C,
-- sum(case when aa.on_net_time=4 then aa.PRE_M_ARPU end) as a2_arpu,
-- sum(case when aa.on_net_time=4 then cc.m end) as a2_m,
-- sum(case when aa.on_net_time=4 then cc.CLV end) as a2_clv,
-- sum(case when aa.on_net_time=4 then b.cust_id end) as ADD_CUST_C,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.PRE_M_ARPU end) as a3_arpu,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.m end) as a3_m,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.CLV end) as a3_clv,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then 1 end) as LOSS_CUST_C,
-- sum(case when a.cust_id is not null then aa.NOW_ARPU end) as EXIST_SUM_NOW_ARPU,
sum(case when aa.on_net_time=4 then aa.NOW_ARPU end) as ADD_SUM_NOW_ARPU ,
sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.NOW_ARPU end) as LOSS_SUM_NOW_ARPU
-- COUNT(b.CUST_ID) as OCCURANCE,
-- COUNT(DISTINCT b.CUST_ID) as OCCURANCE2
from
(select aa.cust_id, aa.pre_m_arpu_d, aa.on_net_time, aa.leave_date, pre_m_arpu, now_arpu
from CUST_CHURN_INFO_200710 aa left outer join V_PRE_EXP_GROUP_CUST1 a
on aa.cust_id = a.cust_id
where (a.cust_id is not null or
aa.on_net_time=4 or
aa.LEAVE_DATE <= '3000-11-30 00:00:00')) aa
inner join CUST_CCP_INFO_200710 cc
on aa.cust_id=cc.cust_id
inner join PAR_CUST_CUST_GRP_ASSOC_200710 b
on aa.cust_id=b.cust_id
group by b.cust_group_id,aa.pre_m_arpu_d
;
/home/db2inst/sql_performance/test2 > db2 -tf t3.sql
GROUP_ID PRE_M_ARPU_D ADD_SUM_NOW_ARPU LOSS_SUM_NOW_ARPU
---------------------- -------------------- --------------------------------- ---------------------------------
1. A 34.70 34.70
2. A 20.60 20.60
2 record(s) selected.
<第四种写法>
/home/db2inst/gaoyuan/sql_performance/test2 > cat t4.sql
select b.cust_group_id as group_id, aa.pre_m_arpu_d,
-- sum(case when a.cust_id is not null then aa.PRE_M_ARPU end) as a1_arpu,
-- sum(case when a.cust_id is not null then cc.m end) as a1_m,
-- sum(case when a.cust_id is not null then cc.CLV end) as a1_clv,
-- sum(case when a.cust_id is not null then 1 end) as EXIST_CUST_C,
-- sum(case when aa.on_net_time=4 then aa.PRE_M_ARPU end) as a2_arpu,
-- sum(case when aa.on_net_time=4 then cc.m end) as a2_m,
-- sum(case when aa.on_net_time=4 then cc.CLV end) as a2_clv,
-- sum(case when aa.on_net_time=4 then b.cust_id end) as ADD_CUST_C,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.PRE_M_ARPU end) as a3_arpu,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.m end) as a3_m,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then cc.CLV end) as a3_clv,
-- sum(case when aa.leave_date<='3000-11-30 00:00:00' then 1 end) as LOSS_CUST_C,
-- sum(case when a.cust_id is not null then aa.NOW_ARPU end) as EXIST_SUM_NOW_ARPU,
sum(case when aa.on_net_time=4 then aa.NOW_ARPU end) as ADD_SUM_NOW_ARPU ,
sum(case when aa.leave_date<='3000-11-30 00:00:00' then aa.NOW_ARPU end) as LOSS_SUM_NOW_ARPU
-- COUNT(b.CUST_ID) as OCCURANCE,
-- COUNT(DISTINCT b.CUST_ID) as OCCURANCE2
from
((select aa.cust_id, aa.pre_m_arpu_d, aa.on_net_time, aa.leave_date, pre_m_arpu, now_arpu
from V_PRE_EXP_GROUP_CUST1 a inner join CUST_CHURN_INFO_200710 aa
on aa.cust_id = a.cust_id) union
(select aa.cust_id, aa.pre_m_arpu_d, aa.on_net_time, aa.leave_date, pre_m_arpu, now_arpu
from CUST_CHURN_INFO_200710 aa
where aa.on_net_time=4 or aa.LEAVE_DATE <= '3000-11-30 00:00:00') ) as aa
inner join CUST_CCP_INFO_200710 cc
on aa.cust_id=cc.cust_id
inner join PAR_CUST_CUST_GRP_ASSOC_200710 b
on aa.cust_id=b.cust_id
group by b.cust_group_id,aa.pre_m_arpu_d
;
/home/db2inst/sql_performance/test2 > db2 -tf t4.sql
GROUP_ID PRE_M_ARPU_D ADD_SUM_NOW_ARPU LOSS_SUM_NOW_ARPU
---------------------- -------------------- --------------------------------- ---------------------------------
1. A 34.70 34.70
2. A 20.60 20.60
2 record(s) selected.
第四种写法中我假设数据会有OVERLAPPING。若是没有OVERLAPPING的话,UNION可以换成UNION ALL。
而这么多种写法中,在不同特定条件下,每一种都有比其他写法执行得快的可能。DATA PATTERN在不同写法中的PERFORMANCE有着决定性的作用。
实践是检验真理的唯一标准,测试是回答PERFORMANCE问题的最佳途径。 |
|