• [转载]利用rowid排序更新大表数据


    现在有个案例,有一张很大的表t1,需要更新其中的一个列,然后这个列是参考另外一个表t2中的列
    直接sql操作如:
    update t1 ta set prov_code=(select area_code from t2 tb where ta.id=tb.id);

    利用rowid,分批提交的思路写出如下sql,执行大表更新效率比较高

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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压力

  • 相关阅读:
    eclipse工具
    Tag
    JSP模版
    Eclipse断点调试
    JavaBean
    验证码设计
    在IE中提示404错误
    序列化与反序列化
    文件编码问题
    强类型,弱类型和推断类型
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480976.html
Copyright © 2020-2023  润新知