我正在尝试更新近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。
谢谢!
答案 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)备份数据库