0

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

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

一个小时过去了,更新还在继续。有人可以帮忙吗?

4

2 回答 2

3

如果您的表有数百万行,那么使用 anUPDATE很可能会花费太多时间。

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

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;
于 2018-06-26T21:05:33.787 回答
-1

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

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

像往常一样,Burleson Consulting 是一个很好的资源:http ://www.dba-oracle.com/t_efficient_update_sql_dml_tips.htm

于 2018-06-26T20:41:40.993 回答