[转载]利用rowid排序更新大表数据
原文地址:利用rowid排序更新大表数据作者:Ryan
现在有个案例,有一张很大的表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压力