天萃荷净
利用rowid排序更新大表数据,现在有个案例,有一张很大的表t1,需要更新其中的一个列,然后这个列是参考另外一个表t2中的列
直接sql操作如:
update t1 ta set prov_code=(select area_code from t2 tb where ta.id=tb.id);
利用rowid,分批提交的思路写出如下sql,执行大表更新效率比较高
DECLARE
CURSOR cur IS
SELECT
a.area_code, b.ROWID ROW_ID
FROM t2 a, t1 b
WHERE a.id = b.id
ORDER BY b.ROWID;
V_COUNTER NUMBER;
BEGIN
V_COUNTER := 0;
FOR row IN cur LOOP
UPDATE t1
SET prov_code = row.area_code
WHERE ROWID = row.ROW_ID;
V_COUNTER := V_COUNTER + 1;
IF (V_COUNTER >= 1000) THEN
COMMIT;
V_COUNTER := 0;
END IF;
END LOOP;
COMMIT;
END;
这里利用了rowid排序,使得update操作是一个一个数据块的进行,减少逻辑读,分批提交减小undo压力
--------------------------------------ORACLE-DBA----------------------------------------
最权威、专业的Oracle案例资源汇总之【学习笔记】Oracle两表更新 利用rowid排序更新两张大表中的数据