问题描述
嗨,汤姆,
我有一个场景,我需要一次更新这么多表 (大约80),每个表至少有5十万记录,我使用下面的方法。
它需要更多的时间 (不确切知道,因为它仍在运行超过一天)。
您能建议其他方法吗?或者我如何有效地进行以下更新?
提前谢谢 ..
Srinadh Tummala
我有一个场景,我需要一次更新这么多表 (大约80),每个表至少有5十万记录,我使用下面的方法。
它需要更多的时间 (不确切知道,因为它仍在运行超过一天)。
您能建议其他方法吗?或者我如何有效地进行以下更新?
CURSOR C_TABLES IS
SELECT TABLE_NAME
FROM ALL_TABLES
WHERE TABLE_NAME LIKE '%Condtion%';
FOR REC_TAB IN C_TABLES LOOP
V_SQL_STRING := 'SELECT TABLE_NAME.C1,
TABLE_NAME.C2,
TABLE_NAME.C3,
NVL(IRS.C4,''UNDEFINED'') SM
FROM ' || REC_TAB.TABLE_NAME ||
' TABLE_NAME, T2 IRS
WHERE TABLE_NAME.C1= T2.C1
AND TABLE_NAME.C2 BETWEEN IRS.C2 AND IRS.C3';
OPEN Cursor FOR V_SQL_STRING;
LOOP
FETCH V_Cursor
INTO V_C1, V_C2, V_C3, V_C4;
EXIT WHEN V_Cursor%NOTFOUND;
V_SQL_STRING := ' UPDATE ' || REC_TAB.TABLE_NAME ||
' SET C3= ''' || V_C4|| '''
WHERE C1= ''' || V_C1|| '''
AND C2= ''' || V_C2|| '''
AND C3= ''' || C_C3|| ''' ';
EXECUTE IMMEDIATE V_SQL_STRING;
---DBMS_OUTPUT.PUT_LINE('Updated Table:' || REC_TAB.TABLE_NAME);
COMMIT;
END LOOP;
END LOOP;
提前谢谢 ..
Srinadh Tummala
专家解答
我们可以进行很多改进-但让我们从2个简单的改进开始,看看是否对您有足够的帮助。
1) 绑定变量
更改
到
2) 提交较少
更改
到
If its still too slow, get back 到us and we'll have more for you.
1) 绑定变量
更改
V_SQL_STRING := ' UPDATE ' || REC_TAB.TABLE_NAME ||
' SET C3= ''' || V_C4|| '''
WHERE C1= ''' || V_C1|| '''
AND C2= ''' || V_C2|| '''
AND C3= ''' || C_C3|| ''' ';
EXECUTE IMMEDIATE V_SQL_STRING;
到
V_SQL_STRING := ' UPDATE ' || REC_TAB.TABLE_NAME ||
' SET C3= :1 '||
' WHERE C1= :2'||
' AND C2= :3 '||
' AND C3= :4 ';
EXECUTE IMMEDIATE V_SQL_STRING using v_c1, v_c2, v_c3, v_c4;
2) 提交较少
更改
COMMIT;
END LOOP;
END LOOP;
到
END LOOP; COMMIT; END LOOP;
If its still too slow, get back 到us and we'll have more for you.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




