我有一张mytable(**id**,colA,colB)
有 500 万条记录的表。colA, colB 没有其他约束。我必须将 colB 中的值复制到 colA 并使 colB 为空。这是我在下面创建的过程。有时它在 5 分钟内运行,有时需要 45 分钟。这个脚本有什么问题?我确定在此期间没有其他进程访问此表。我该如何优化呢?(我知道还有很多其他因素会影响这个速度,比如数据库引擎本身很慢,可能是当时机器满负荷运行。我正在寻找我手中的东西,即我的脚本。 )
DECLARE
l_update_total pls_integer := 0;
CURSOR cur IS SELECT id, colB FROM mytable where colA is null;
TYPE t_recs IS TABLE OF cur%ROWTYPE;
l_loop_count pls_integer := 0;
l_recs t_recs;
l_rec cur%ROWTYPE;
BEGIN
OPEN cur;
LOOP
FETCH cur BULK COLLECT INTO l_recs LIMIT 500;
EXIT WHEN l_recs.COUNT = 0;
FOR indx IN 1 .. l_recs.COUNT
LOOP
l_rec := l_recs(indx);
UPDATE mytable SET colB=null,colA = l_rec.colB WHERE id = l_rec.id;
l_update_total := l_update_total + SQL%ROWCOUNT;
END LOOP;
COMMIT;
END LOOP;
END;
/