Sql 更新数百万行时的Oracle性能

Sql 更新数百万行时的Oracle性能,sql,oracle,Sql,Oracle,我正在尝试更新近8亿行并搜索最佳方法。 我已经尝试使用批量收集和更新,但需要很长时间。 我在每5000条记录后提交。 130分钟。我只准备了0.25%,所以我正在寻找另一种方法。 表的结构是 CAMP_TASK NUMBER CODE_SYSTEM VARCHAR2(10 CHAR) ID_SOURCE VARCHAR2(40 CHA

我正在尝试更新近8亿行并搜索最佳方法。 我已经尝试使用批量收集和更新,但需要很长时间。 我在每5000条记录后提交。 130分钟。我只准备了0.25%,所以我正在寻找另一种方法。 表的结构是

CAMP_TASK                        NUMBER             
CODE_SYSTEM                      VARCHAR2(10 CHAR)  
ID_SOURCE                        VARCHAR2(40 CHAR)  
ID_SOURCE_PARENT                 VARCHAR2(40 CHAR)  
DATE_EFFECTIVE                   DATE               
PROC_INSERTED                    NUMBER             
PROC_UPDATED                     NUMBER             
CAMP_TASK_PARENT                 NUMBER
如果id\u source\u parent不为空,我必须用camp\u task值更新
camp\u task\u parent
字段。换句话说,如果有一个id\u source\u父对象,我会找到他相应的cam\u任务,并用它更新当前行的camp\u task\u父对象


谢谢

最快的方法是

1) 创建具有相同结构的新空表

create table new_table as select * from old_table where 1=2;
2) 禁用该表的日志记录,以便不会耗尽恢复 面积空间

alter table new_table nologging;
3) 使用更新的记录填充新表,绕过约束, 触发器和缓冲区缓存

insert /*+ APPEND */ into new_table (select <update column expressions> from old_table);
6) 重新创建索引


7) 备份数据库

您真的需要在一个大事务中完成吗?好吧,我在每5000条记录之后提交一次。因此表中大约有8亿条记录具有ID\u源\u父级?当您总是可以从另一个表中读取值时,为什么必须更新这些值?只是为了方便出入吗?如果你不介意的话,请告诉我们这个过程最终需要多长时间,如果你有资源的话;CPU和IO带宽,您也可以使用并行性。
 drop old_table;
 alter table new_table logging;
 rename new_table to old_table;