多条件游标更新 变CASE WHEN更新法提高速度

定义个结构体数组

 type ty_parmeter is record
 (
   v_hezuotype number(1),
   v_comefrom  varchar2(50),
   v_regchannel varchar2(50),
   v_newchannel nvarchar2(30)
 ) ;

 type ty_parmeter_table is table of ty_parmeter  index by binary_integer;
 parameter_arry  ty_parmeter_table;

BEGIN

 

parameter_arry(1).F_CHANNEL:=N'财付通';   parameter_arry(1).F_TYPE:=1; parameter_arry(1).F_COME:='cft';     parameter_arry(1).F_REG:='cftwan';
parameter_arry(2).F_CHANNEL:=N'拍拍';     parameter_arry(2).F_TYPE:=1; parameter_arry(2).F_COME:='paipai';  parameter_arry(2).F_REG:='paipai';
parameter_arry(7).F_CHANNEL:=N'支付宝';   parameter_arry(7).F_TYPE:=2; parameter_arry(7).F_COME:='zfb';     parameter_arry(7).F_REG:='zfbwan';
parameter_arry(17).F_CHANNEL:=N'新浪';    parameter_arry(17).F_TYPE:=0; parameter_arry(17).F_COME:='%sina%';parameter_arry(17).F_REG:='NULL';
parameter_arry(18).F_CHANNEL:=N'搜狐';    parameter_arry(18).F_TYPE:=0; parameter_arry(18).F_COME:='%sohu%';parameter_arry(18).F_REG:='NULL';
parameter_arry(22).F_CHANNEL:=N'搜索引擎';parameter_arry(22).F_TYPE:=0; parameter_arry(22).F_COME:='SEO%';  parameter_arry(22).F_REG:='NULL';
parameter_arry(23).F_CHANNEL:=N'主站';    parameter_arry(23).F_TYPE:=0; parameter_arry(23).F_COME:='NULL';  parameter_arry(23).F_REG:='NULL';

 

   for i in 1..14
    LOOP
      update t_gather_userinfo
       set    F_REG_CHANNEL=parameter_arry(i).f_channel,

                F_UPDATEDATE=sysdate
       where  F_TYPE = parameter_arry(i).f_type
       AND    F_COME =parameter_arry(i).f_come
       AND    F_REG =parameter_arry(i).f_reg
       and    F_REG_CHANNEL is null;
      v_rownum :=sql%rowcount;
      COMMIT;
    END LOOP;


   for i in 15..22 loop
      update t_gather_userinfo
       set    F_REG_CHANNEL=parameter_arry(i).f_channel,

                F_UPDATEDATE=sysdate
       where  F_TYPE = parameter_arry(i).f_type
       AND    F_COME like parameter_arry(i).f_come

       AND    F_REG =parameter_arry(i).f_reg
       and    F_REG_CHANNEL is null;
       v_rownum :=sql%rowcount;
      COMMIT;
   end loop;

   update t_gather_userinfo
       set    F_REG_CHANNEL=parameter_arry(23).f_channel,

                F_UPDATEDATE=sysdate
       where F_REG_CHANNEL is null;
   v_rownum :=sql%rowcount;
   COMMIT;

 

 

这段代码 在8个CPU 32核 30G内存机器上跑 时间 1分钟,16分钟 26,28,30分钟

要迁到差劲2个CPU  8核的机器上 跑的后果是 分别为 114,116,115,146分钟 update 1万9千条数据

 

采用CASE WHEN写法 就全表扫描一次

  UPDATE t_gather_userinfo
      SET f_reg_new_channel =
             CASE
                WHEN f_type = 1 AND f_come = 'CFT' AND f_reg = 'cftwan'
                   THEN '财付通'
                WHEN f_type = 1 AND f_come = 'PAIPAI' AND f_reg = 'paipai'
                   THEN '拍拍频道'
                WHEN f_type = 2 AND f_come = 'ZFBReg' AND f_reg = 'zfbwan'
                   THEN '支付宝'
                WHEN f_type = 0 AND f_come LIKE '%sina%'
                   THEN '新浪'
                WHEN f_type = 0 AND f_come LIKE '%sohu%'
                   THEN '搜狐'
             ELSE 'MAINWEB'
             END,
          f_updatedate = SYSDATE
    WHERE f_reg_new_channel IS NULL;                  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值