Oracle存储过程优化小实践

日期: 2010-04-26 作者:Yokie 来源:TechTarget中国 英文

近日,接触到ORACLE 存储过程的优化问题,业务过程非常简单。该存储过程的主要DML操作就是UPDATE,需要根据某个条件对数据表的某个字段进行更新,其中使用到游标。之后写了个测试的例子,以下具体介绍。   测试环境:   OS:WINDOWS XP +Intel(R) 2CPU(1.60GHz) + 1GB   数据库: ORACLE10g   测试数据:10万行   存储过程代码:   CREATE OR REPLACE PROCEDURE prc_update_0   IS   TYPE tab_id IS TABL……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

近日,接触到ORACLE 存储过程的优化问题,业务过程非常简单。该存储过程的主要DML操作就是UPDATE,需要根据某个条件对数据表的某个字段进行更新,其中使用到游标。之后写了个测试的例子,以下具体介绍。

  测试环境:

  OS:WINDOWS XP +Intel(R) 2CPU(1.60GHz) + 1GB

  数据库: ORACLE10g

  测试数据:10万行

  存储过程代码:

  CREATE OR REPLACE PROCEDURE prc_update_0
  IS
  TYPE tab_id IS TABLE OF ROWID;
  CURSOR cur_sky IS SELECT ROWID FROM TBL_USER_AUTH WHERE IMSI IS NOT NULL;
  BEGIN
  OPEN cur_sky ;
  FETCH cur_sky BULK COLLECT INTO v_rowid ;
  FORALL i IN 1..v_rowid.COUNT
  UPDATE TBL_USER_AUTH SET MPXYZDATAE='nsofsofmslfd' WHERE ROWID = v_rowid(i);
  COMMIT;
  CLOSE cur_sky;
  EXCEPTION
  WHEN others THEN
  ROLLBACK;
  DBMS_OUTPUT.PUT_LINE('Update failed !');
  END;
  /
  CREATE OR REPLACE PROCEDURE prc_update_1
  IS
  v_rowid ROWID;
  CURSOR cur_sky IS SELECT ROWID FROM TBL_USER_AUTH WHERE IMSI IS NOT NULL;
  BEGIN
  OPEN cur_sky ;
  LOOP
  FETCH cur_sky INTO v_rowid ;
  EXIT WHEN cur_sky%NOTFOUND;
  UPDATE TBL_USER_AUTH SET MPXYZDATAE='nsofsofmslfd' WHERE ROWID = v_rowid;
  END LOOP;
  COMMIT;
  CLOSE cur_sky;
  EXCEPTION
  WHEN others THEN
  ROLLBACK;
  DBMS_OUTPUT.PUT_LINE('Update failed !');
  END;
  /
  测试结果:

  运行次数

  时间(s) 1 2 3 4 5 6 7 8 9 10 avg

  prc_update_0 5 4 4 7 4 4 8 8 4 8 5.6

  prc_update_1 9 11 9 10 13 9 9 9 11 9 9.9

  从以上结果可以看出:

  对于游标的循环,BULK COLLECT对性能的改善有很大的提高。实验数据只有10万行,当数据量达到千万级的时候,运行时间的差距就非常明显。

作者

Yokie
Yokie

相关推荐