遭遇极品 开发人员

由于项目要从 UAT环境迁移到 Prod 环境,infosys(阿三) team 的人要我运行下面的SQL,具体的业务逻辑我就不多说了。

BEGIN

Update ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
TP_END_DATE =
( select TO_NUMBER(TO_CHAR((TP_END_DATE),'YYYYMMDD')) from CAL_MASTR_DIM b
where a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

Update ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
WK_END_DATE =
( select TO_NUMBER(TO_CHAR((WK_END_DATE),'YYYYMMDD') from CAL_MASTR_DIM b where
a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

Update ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
MTH_START_DATE =
( select TO_NUMBER(TO_CHAR((MTH_START_DATE),'YYYYMMDD') from CAL_MASTR_DIM b where
a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

Update ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
MTH_END_DATE =
( select TO_NUMBER(TO_CHAR((MTH_END_DATE),'YYYYMMDD') from CAL_MASTR_DIM b where
a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

COMMIT;

END;
/

SQL> select count(*) from ADWGU_DICFR.DICFR_ORDR_CUT_FCT ; ---这个表有5百多万记录

COUNT(*)
----------
5615733

相信你看了这个过程肯定要发狂了,这简直就是极品开发人员写的啊,印度阿三,哎,水平确实不咋地,妈的项目上面的性能问题绝大部分就是这些SB开发人员乱写SQL,写好了也不给我检查。哥就不明白为啥不能在一个 SQL里面搞定所有的update,而非要

单独的update。我前面一篇博客才写了 一个update的优化案例, 那么这里也适用,下面就是我改写的SQL


declare
cursor c is
select
TO_NUMBER(TO_CHAR((b.TP_END_DATE),'YYYYMMDD')) TP_END_DATE,
TO_NUMBER(TO_CHAR((b.WK_END_DATE),'YYYYMMDD')) WK_END_DATE,
TO_NUMBER(TO_CHAR((b.MTH_START_DATE),'YYYYMMDD')) MTH_START_DATE,
TO_NUMBER(TO_CHAR((b.MTH_END_DATE),'YYYYMMDD')) MTH_END_DATE,
a.rowid row_id
from ADWGU_DICFR.DICFR_ORDR_CUT_FCT a, ADWGU_DICFR.CAL_MASTR_DIM b
where a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')) ;
v_counter number;
begin
v_counter := 0;
for v_row in c loop
update ADWGU_DICFR.DICFR_ORDR_CUT_FCT
set TP_END_DATE = v_row.TP_END_DATE,
WK_END_DATE = v_row.WK_END_DATE,
MTH_START_DATE = v_row.MTH_START_DATE,
MTH_END_DATE = v_row.MTH_END_DATE
where rowid = v_row.row_id;
v_counter := v_counter + 1;
if (v_counter >= 1000) then
commit;
v_counter := 0;
end if;
end loop;
commit;
end;
/

改写后的SQL 28分钟就完成了
PL/SQL procedure successfully completed.

Elapsed: 00:27:59.81

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值