利用rowid排序更新大表数据

联系:手机(13429648788)  QQ(107644445)

链接:https://www.orasos.com/%e5%88%a9%e7%94%a8rowid%e6%8e%92%e5%ba%8f%e6%9b%b4%e6%96%b0%e5%a4%a7%e8%a1%a8%e6%95%b0%e6%8d%ae.html

标题:利用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压力

One thought on “利用rowid排序更新大表数据

Comments are closed.