更新具有数百万条记录的多个列

时间:2018-06-26 20:30:58

标签: sql oracle

我的表有数百万条记录,并且添加了两个新列

alter table hr.employees add (ind char(1Byte), remove Char(1 Byte)); commit;

我有另一个视图hr.department,它的数据比这多,并且具有这两列。

因此,如果我为这些记录编写和更新,则需要花费很长时间。

update hr.employees a 
set (ind, remove) =(select ind, remove 
                    from hr.department b 
                    where a.dept_id = b.dept_id ) ;

距离更新还有一个小时了。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

如果表有数百万行,则使用UPDATE很可能会花费太多时间。

我将重命名旧表,使用已经填充的新列创建一个新表,然后添加索引,约束,注释并收集统计信息。

RENAME employees to employees_old;

CREATE TABLE employees AS
SELECT a.col1, a.col2, ... a.coln, b.ind, b.remove 
  FROM employees_old a
  LEFT JOIN department b
    ON a.dept_id = b.dept_id;

答案 1 :(得分:-1)

处理此更新的最简单方法可能是:

  1. 找到一个没有别人会严重使用该系统的时间。
  2. 进行备份。
  3. 如果尚不存在,请复制DDL以在该表上创建所有索引/约束。
  4. 删除该表上的所有索引/约束。
  5. 更新您的两列。
  6. 重新创建索引/约束(这可能需要一些时间,但通常比使用多个索引更新大表中的每一行要少几个数量级)。

与往常一样,伯乐森咨询公司是一个很好的资源:http://www.dba-oracle.com/t_efficient_update_sql_dml_tips.htm