更新数百万行时的Oracle性能

时间:2017-06-22 12:36:07

标签: sql oracle

我正在尝试更新近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_source_parent不为null,我必须使用camp_task值更新camp_task_parent字段。所以换句话说,如果有一个id_source_parent,我找到了他对应的cam_task,并为当前划船更新了camp_task_parent。

谢谢!

1 个答案:

答案 0 :(得分:5)

最快的方式是

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);

4)仔细检查数据是否正确迁移

5)清理

 drop old_table;
 alter table new_table logging;
 rename new_table to old_table;

6)重新创建索引

7)备份数据库