大家好,最近写了一个过程,是来更新数据,每天执行,每天要更新的数据量大概在1000万条,我的过程效率不是很高,大家看看能不能帮我提高效率,分不够可以再加!!
代码如下:
CREATE OR REPLACE  PROCEDURE WQ_UP_WWQ_TEST_MAPPING
as
rowsum        number;           /*记录总数*/
currentpage   number;           /*要更新的数据页码*/
allPage       number;           /*总的数据页码*/
page_num      number;           /*每页的数据量*/
check_id      number;           /*业务ID号*/
num           number;
--Uf_get_id(id1,id2,id3) 这个是个函数,取值用的,基本不占资源;
begin  
allPage :=10;
/*取得要更新的表的总记录数*/
    select count(1) into  rowsum 
         from WQ_TEST_TABLE;
/*得到每页的平均记录数*/
    page_num :=TRUNC((rowsum/allPage),0);
/*开始批量更新数据*/
    while num <10
       LOOP
           BEGIN
              update WQ_TEST_TABLE
                  set ID= Uf_get_id(id1,id2,id3)
                  where rownum>(num-1)*page_num 
                        and rownum<=num*page_num ;       
           END;
            commit;
       END LOOP;end;

解决方案 »

  1.   

    where rownum>(num-1)*page_num 
                            and rownum<=num*page_num ;   
    你确定这句有效吗?在num>1的时候?
    另外,从效率上将把num*page_num 这类的计算结果先算出来载执行sql会快一些。
      

  2.   

    楼上的兄弟,可能我贴的代码有问题,其实num就是设定的页数,从1开始循环到10,分页更新
      

  3.   

    update WQ_TEST_TABLE
                      set ID= Uf_get_id(id1,id2,id3)
                      where rownum>(num-1)*page_num 
                            and rownum<=num*page_num ;       
    这句没有达到预期的效果,分叶不是这样写的
      

  4.   

    create or replace procedure Test as 
          TYPE t_id IS TABLE OF WQ_TEST_TABLE.id%TYPE;
          v_t_id t_id;
        
          CURSOR c IS
            SELECT id FROM WQ_TEST_TABLE  ;
          -- 循环次数
          cnt NUMBER := 0;   BEGIN
         OPEN c;
         LOOP
             cnt := cnt + 1;
             -- 批量更新,一次更新10000条数据
             fetch c bulk collect into v_t_id LIMIT 10000;
             FORALL i IN 1 .. v_t_id.COUNT
             UPDATE WQ_TEST_TABLE SET id = Uf_get_id(id1,id2,id3) WHERE id = v_t_id(i);         -- 提交
             COMMIT;
             -- 循环退出
             exit when c%NOTFOUND;
       
         END LOOP;
       
         dbms_output.put_line('循环次数:' || cnt);
       
         CLOSE c;
         COMMIT;
       end Test;
      

  5.   

    楼上的兄弟(xiaoxiao1984(潇潇) ),你的这段代码如果更新1000万条数据大约需要多少时间?