ORACLE 高效的批量处理

两个大表join,b表5千万,c表7千万,统计出佣金更新a表。

原语句:

UPDATE TMP_GX_UNDW3820 A
     SET (A.佣金) = (SELECT SUM(B.COMMISSION)
                       FROM PREM_INFO C, LCS_COMMISSION_TRAIL B
                      WHERE C.PK_SERIAL# = B.PK_SERIAL#
                        AND A.保单号 = C.POLNO);

全表扫描,一天都跑不出结果。

增加两个索引:

create index t_prem on aud_lucs0.prem_info(POLNO,pk_serial#); 

create index t_lcs on aud_lucs0.LCS_COMMISSION_TRAIL(pk_serial#,commission);

 

修改一下select 部分,大概1小时不到可以出结果。

SELECT/*+index(c, t_prem) index(b, t_lcs ) use_hash(b c)*/SUM(B.COMMISSION)
                       FROM PREM_INFO C, LCS_COMMISSION_TRAIL B
                      WHERE C.PK_SERIAL# = B.PK_SERIAL#
                        group by  C.POLNO;

 

 

采用bulk collect 方式,22秒完成。效率不是一般的高~~~ 

set serveroutput on

declare

  type t_polno is table of aud_lucs0.TMP_GX_UNDW3820.保单号%type index by binary_integer;  

 

  v_p t_polno;

begin

  select 保单号 bulk collect into v_p from aud_lucs0.TMP_GX_UNDW3820 ;

  forall i in v_p.first .. v_p.last 

    UPDATE TMP_GX_UNDW3820 A

       SET (A.佣金) =

           (SELECT /*+index(b t_lcs)*/

             SUM(B.COMMISSION)

              FROM PREM_INFO C, LCS_COMMISSION_TRAIL B

             WHERE C.PK_SERIAL# = B.PK_SERIAL#

               and c.polno =a.保单号)

     where a.保单号 = v_p(i);

end;

/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值