关于ROWID的介绍参考我的Blog:
Oracle Rowid 介绍
http://blog.csdn.net/tianlesoftware/archive/2009/12/16/5020718.aspx
关于大表Update 的一个讨论,参考itpub:
http://www.itpub.net/viewthread.php?tid=1052077
一. 在虚拟机上 使用rowid 进行update 测试
使用rowid 进行update能提高速度,是因为通过rowid 能够迅速的进行定位,不用全表进行扫描。
-- 查看表dave 记录数
SYS@dave2(db2)> select count(*) from dave;
COUNT(*)
----------
3080115 --300万数据
-- 创建测试表dba
SYS@dave2(db2)> create table dba as select * from dave;
Table created.
--用dave 表去更新DBA表
SYS@dave2(db2)> update dba ta set prov_code=(select area_code from dave tb where ta.id=tb.id);
3080115 rows updated.
Elapsed: 00:16:12.81 -- 整个更新花了16分钟
--update 期间查看session 执行时间:
SQL>select sid,target,time_remaining,elapsed_seconds,message,sql_id from v$session_longops where sid=138;
select * from v$lock where sid=138;
select * from v$session_wait where sid=138;
-- 使用rowid 进行更新
CURSOR cur IS
SELECT
a.area_code, b.ROWID ROW_ID
FROM dave a, dba b
WHERE a.id = b.id
ORDER BY b.ROWID; ---如果表的数据量不是很大,可以不用 order by rowid
V_COUNTER NUMBER;
BEGIN
V_COUNTER := 0;
FOR row IN cur LOOP
UPDATE dba
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;
-->
- 该日志由 fiancee 于12年前发表在综合分类下,最后更新于 2012年06月20日.
- 转载请注明: Oracle 利用 rowid 提升 update 性能 | 学步园 +复制链接