现有一张目标表des,另有一张源数据表src。这两个表中的数据量都很大,且都有超过上亿条的数据。
目标:把src表中的数据写入des中,且如果数据在des中存在,则忽略。刚一开始我用了例外表的方法实现,类似如下:while src has data loop
--每次只写入10000条数据,循环执行
update src set flag='1' where flag is null and rownum<10000;
insert into des select * from src where flag=1 log errors into err_log_table... update src set flag='2' where flag='1'
end loops;但是运行一段时间后,我试图充分利用服务器的高性能,所以,希望用多线程并发的方式提高性能。于是简单做了一下修改:alter session enable parallel dml;while src has data loop
--每次只写入10000条数据,循环执行
update /*+ parallel(a,8) */ src a set flag='1' where flag is null and rownum<10000;
insert /*+ parallel(a,8) */ into des a select /*+ parallel(b,8) */ * from src b where flag=1 log errors into err_log_table... update /*+ parallel(a,8) */ src a set flag='2' where flag='1'
end loops;
但是,发现如果这个时候有主键冲突的情况时,系统就直接报“违反唯一约束条件”这样的错误了,而不是像第一种情况时,写入例外表中。不知道各位有没有遇到过这种并发处理时类似的问题。或者说对这样一种大数据量写入,有没有什么更好的建议。
目标:把src表中的数据写入des中,且如果数据在des中存在,则忽略。刚一开始我用了例外表的方法实现,类似如下:while src has data loop
--每次只写入10000条数据,循环执行
update src set flag='1' where flag is null and rownum<10000;
insert into des select * from src where flag=1 log errors into err_log_table... update src set flag='2' where flag='1'
end loops;但是运行一段时间后,我试图充分利用服务器的高性能,所以,希望用多线程并发的方式提高性能。于是简单做了一下修改:alter session enable parallel dml;while src has data loop
--每次只写入10000条数据,循环执行
update /*+ parallel(a,8) */ src a set flag='1' where flag is null and rownum<10000;
insert /*+ parallel(a,8) */ into des a select /*+ parallel(b,8) */ * from src b where flag=1 log errors into err_log_table... update /*+ parallel(a,8) */ src a set flag='2' where flag='1'
end loops;
但是,发现如果这个时候有主键冲突的情况时,系统就直接报“违反唯一约束条件”这样的错误了,而不是像第一种情况时,写入例外表中。不知道各位有没有遇到过这种并发处理时类似的问题。或者说对这样一种大数据量写入,有没有什么更好的建议。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货