大家好,最近写了一个过程,是来更新数据,每天执行,每天要更新的数据量大概在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;
代码如下:
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;
and rownum<=num*page_num ;
你确定这句有效吗?在num>1的时候?
另外,从效率上将把num*page_num 这类的计算结果先算出来载执行sql会快一些。
set ID= Uf_get_id(id1,id2,id3)
where rownum>(num-1)*page_num
and rownum<=num*page_num ;
这句没有达到预期的效果,分叶不是这样写的
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;