[转载]利用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压力

posted @ 2011-11-08 15:19  刘竹青  阅读(210)  评论(0编辑  收藏  举报