【问题标题】:Oracle performance when updating millions of rows更新数百万行时的 Oracle 性能
【发布时间】:2017-06-22 12:36:07
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你真的需要在一笔大交易中完成吗?
  • 好吧,我在每 5000 条记录后提交
  • 那么表中大约有8亿条记录有ID_SOURCE_PARENT?当你总是可以从另一个表中读取它们时,为什么你必须更新它们?只是为了方便访问吗?那么也许一个视图就足够了。
  • 如果您不介意,请告诉我们这个过程最终花了多长时间

标签: sql oracle


【解决方案1】:

最快的方法是

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) 备份数据库

【讨论】:

  • 如果你有资源; CPU 和 IO 带宽,你也可以使用并行。
猜你喜欢
  • 2019-06-28
  • 2013-11-27
  • 2021-11-06
  • 2016-05-02
  • 1970-01-01
  • 2021-04-06
  • 2018-12-26
  • 2023-01-05
  • 1970-01-01
相关资源
最近更新 更多