巨大记录的数据库更新查询

时间:2012-10-15 03:21:43

标签: sql oracle

我们在表中有大约20,80,000条记录。 我们需要添加新列,我们添加了它。

由于这个新列需要是主键,我们希望用Sequence更新所有行 这是查询

BEGIN
FOR loop_counter IN 1 .. 211 LOOP
update user_char set id = USER_CHAR__ID_SEQ.nextval where user_char.id is null and rownum<100000;
commit;
END LOOP;
end;

但它现在差不多有一天完成了。仍然查询正在运行。 注意:我不是db developer / programmer。

此查询或任何其他查询解决方案(快速)执行相同的工作是否有任何问题?

1 个答案:

答案 0 :(得分:2)

首先,似乎没有任何理由在这里使用PL / SQL。简单地发出单个SQL语句来更新每一行

会更有效
UPDATE user_char
   SET id = USER_CHAR__ID_SEQ.nextval
 WHERE id IS NULL;

根据具体情况,创建新表并将数据从旧表移动到新表以避免行迁移也可能更有效,即

ALTER TABLE user_char
  RENAME TO user_char_old;

CREATE TABLE user_char
AS
SELECT USER_CHAR__ID_SEQ.nextval, <<list of other columns>>
  FROM user_char;

<<Build indexes on user_char>>
<<Drop and recreate any foreign key constraints involving user_char>>

如果这是一个大表,您可以在CREATE TABLE语句中使用并行性。你可以通过一个小的200万行表从并行性中获得很多好处,但这可能会使操作停止几秒钟。

其次,如果需要一天时间来更新仅仅200万行,那么必然会有其他事情发生。如今,200万行表非常小 - 我可以在几秒钟到几分钟之间的某个地方填充和更新笔记本电脑上的200万行表。这张桌子上有触发器吗?有外键吗?是否有其他会话更新行?什么是等待的查询?