首先,似乎没有任何理由在这里使用 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 万行的表。这张桌子上有触发器吗?有外键吗?是否有其他会话更新行?查询在等待什么?