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