【发布时间】:2017-01-20 15:28:56
【问题描述】:
我有一个表AA包含6列(a,b,c,d,e,f),有2亿条记录有a,b, c 作为复合键。 a 列或b 列或c 列可能有多个重复条目。 c 列有多个条目,每个条目有 a 和 b。
我必须将a,b,d,e,f(c 不存在)列的值复制到另一个具有列a,@ 的表 AB 中987654343@,d,e,f 与 a,b,d 作为复合键,因此列 d 可以具有最大值 2 和 a,@98 ,d 最多应该有 2 个条目。
我已经写了一个程序:
CREATE OR REPLACE Table_CHANGES(d IN AB.d%TYPE)
AS
aaa AB.a%TYPE;
aab AB.b%TYPE;
i NUMBER := 0;
countRow NUMBER;
CURSOR distinctUserIdCursor IS
SELECT DISTINCT urt.a, urt.b FROM AA urt WHERE urt.d = aad ORDER BY urt.a;
BEGIN
OPEN distinctUserIdCursor;
LOOP
FETCH distinctUserIdCursor INTO aaa, aab;
EXIT WHEN distinctUserIdCursor%NOTFOUND;
SELECT COUNT(*) INTO countRow FROM AB ur
WHERE ur.a = aaa
AND ur.b = aab
AND ur.d = aad;
IF (countRow > 0) THEN
DBMS_OUTPUT.PUT_LINE('Entry exist in AB');
ELSE
INSERT INTO AB
SELECT urt.a, urt.b, urt.d, urt.e,
urt.f FROM AA urt
WHERE urt.a = aaa
AND urt.d = aad
AND urt.b = aab
AND ROWNUM = 1;
i := i+1;
END IF;
IF (i = 1000) THEN
COMMIT;
i := 0;
END IF;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error in Insertion of new role'
|| '~~~~' || SQLERRM);
CLOSE distinctUserIdCursor;
END;
/
在 Toad 中以 exec Table_CHANGES('value1') 和 exec Table_CHANGES('value2') 执行此过程时,大约需要 40 分钟并在 toad 中继续执行。很难知道蟾蜍实际上是在执行任务还是在睡觉。
我可以优化这个过程,以减少在表AB中插入几千万条数据的时间吗?
【问题讨论】:
标签: sql oracle oracle11g oracle-sqldeveloper plsqldeveloper