【问题标题】:Update multiple columns which has millions of records更新具有数百万条记录的多个列
【发布时间】:2018-06-26 20:30:57
【问题描述】:

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

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

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

【问题讨论】:

标签: sql oracle


【解决方案1】:

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

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

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;

【讨论】:

  • 随着时间的推移,这是我见过的最成功的解决方案 - 使用更改构建一个新表,然后删除现有的并切换
【解决方案2】:

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

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

像往常一样,Burleson Consulting 是一个很好的资源:@​​987654321@

【讨论】:

  • 实际上,Burleson 网站是一个相当不稳定的建议来源,其中包含一些有用的内容和一些完全错误的建议。您发布的链接就是一个很好的例子,其中的建议已经有将近 20 年的历史了(对 Oracle 9i 的引用是赠品)。
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多