--游标更新,批量提交 --设定一万条数据提交一次,耗时十多个小时未获得任何反馈,中断执行,从新分解 --维保信息(目标),T_BIZ_Temp,数据量7500万行 --维修工时(源表),T_MTD_Time,数据量1.5亿行,150列 --源表批量更新目标表,根据两表之间的关联字段(VohId),源表有多行记录匹配目标表 --按照要求,源表中取任意一条相匹配的记录更新目标表便可 declare v_count number; --计数器 begin for data in( select temp.rowid, time.SrvCode from T_BIZ_Temp temp, T_MTD_Time time where time.VohId = temp.VohId ) loop update T_BIZ_Temp temp set temp.SrvCode = data.SrvCode where temp.rowid = data.rowid; v_count := v_count + 1; if v_count >= 10000 then commit; v_count := 1; end if; end loop; commit; end; --脚本优化,任务分解 --最终耗时也达到十多个小时,可是最终执行成功 --源表中取任意一条相匹配的记录更新目标表便可,为了使用merge into,源表需去除重复数据 --建立临时表,维修工时,源表含有150列数据,对源表进行简化,只抽取有用的数据列 create table t_time as select VohId, SrvCode from T_MTD_Time where rownum = 1; --删除预设数据 delete from t_time; --临时表设置主键,去除重复数据后,惟一匹配加快检索速度 alter table t_time add constraint pk_time primary key(VohId); --临时表插入数据,耗时330分钟,74562964行; --分组以后,去除重复数据(任取一行),数据量由原来的1.5亿行减小一半 insert into /*+ APPEND parallel(4) NOLOGGING*/ t_time(VohId, SrvCode) select VohId, min(SrvCode) from T_MTD_Time group by VohId; --批量更新,耗时320分钟 --去除重复数据以后,实现源表中记录惟一匹配目标表 merge /*+parallel(temp, 4)*/ into T_BIZ_Temp temp using t_time time on (temp.VohId = time.VohId) when matched then update set temp.SrvCode = time.SrvCode