Sql 海量记录的数据库更新查询

Sql 海量记录的数据库更新查询,sql,oracle,Sql,Oracle,我们的表中有大约2080000条记录。 我们需要向它添加新的列,并且我们添加了它 因为这个新列需要是主键,并且我们希望用序列更新所有行 这是问题 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; 但它现在差不多完成了一天

我们的表中有大约2080000条记录。 我们需要向它添加新的列,并且我们添加了它

因为这个新列需要是主键,并且我们希望用序列更新所有行 这是问题

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开发者/程序员


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

首先,这里似乎没有任何理由使用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>>
如果这是一个大表,那么可以在CREATETABLE语句中使用并行性。对于一个200万行的小表来说,并行性并不会给您带来很多好处,但这可能会减少几秒钟的操作时间


其次,如果仅仅更新200万行需要一天的时间,那么肯定还有其他事情在进行。现在200万行的表格非常小——我可以在几秒钟到几分钟的时间内在笔记本电脑上填充和更新200万行的表格。这张桌子上有触发器吗?有外键吗?是否有其他会话更新行?查询在等待什么?

有一个触发器。但那是为了插入。有两个for.key,但它们在其他列上。@NitinGurram-OK。有外键吗?是否有其他会话更新这些行?查询在等待什么?我不知道为什么查询要花费这么多时间。现在没有其他会话更新这些行。现在除了我没有人可以访问数据库。@NitinGurram-好的。会议在等什么?V$会话中的事件是什么?阻塞会话是否有价值?您是否有使用AWR和ASH表的许可证?您跟踪了会话吗?@NitinGurram-是否有DBA可以帮助您获取所需信息,以了解是什么导致您的查询耗时如此之长?更新一行表中的一行需要10分钟,这是毫无意义的——这强烈暗示服务器上出现了严重错误。可能有一些失控的进程消耗了所有的资源,可能服务器上有其他数据库消耗了所有的资源,可能磁盘坏了,等等。