现在的位置: 首页 > 综合 > 正文

Oracle 利用 rowid 提升 update 性能

2012年06月20日 ⁄ 综合 ⁄ 共 1185字 ⁄ 字号 评论关闭

 

关于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 进行更新

DECLARE

  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;

-->

作者:

抱歉!评论已关闭.