1

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

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

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;

但它现在几乎 1 天完成。查询仍在运行。注意:我不是数据库开发人员/程序员。

这个查询或任何其他查询解决方案(快速)做同样的工作有什么问题吗?

4

1 回答 1

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 万行的表。这张桌子上有触发器吗?有外键吗?是否有其他会话更新行?查询在等待什么?

于 2012-10-15T03:30:36.140 回答