我们在表中有大约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开发人员/程序员。
这个查询或任何其他查询解决方案(快速)执行相同的工作是否有问题?
发布于 2012-10-15 11:30:36
首先,似乎没有任何理由在这里使用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万行表。这张桌子上有触发器吗?有外键吗?是否有其他会话更新行?查询等待的是什么?
https://stackoverflow.com/questions/12888864
复制相似问题