ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 大表分批更新一例

大表分批更新一例

原创 Linux操作系统 作者:to_be_dba 时间:2013-07-10 15:39:03 0 删除 编辑
 

有一张六百多万数据的表ref_ndairs,现在需要将里面的air_code字段的空格去掉。
数据量太大,直接更新比较困难。
以下是借助主键(序列)ndairs_seq分批更新的语句。

declare
  type typ_min_n is table of number;
  min_n typ_min_n;
  max_n typ_min_n;
begin
  select t.minn + level * 10000, t.minn + (level + 1) * 10000
  bulk collect  into min_n, max_n
    from (select max(ndairs_seq) maxx, min(ndairs_seq) minn
            from ref_ndairs) t
   where t.maxx > t.minn + level * 10000
  connect by level < 3000;--这个3000是我随便给的值,由于where条件的限制,子表t中实际生成600多条数据
  for i in min_n.first .. min_n.last loop
   execute immediate ' update ref_ndairs  set air_code = trim(air_code)
     where ndairs_seq >= :min_na and ndairs_seq <= :max_na'
      using min_n(i), max_n(i);
    commit;
  end loop;
end;
/
虽然比较简单,但由于以前没用过,记下来已被后续使用。
执行结束后通过语句查询:(由于以前没执行过该语句,所以时间差是准确的)
select first_load_time,last_active_time,executions from v$sql where sql_text like '% update ref_ndairs %';
  FIRST_LOAD_TIME     LAST_ACTIVE_TIME   EXECUTIONS
1 2013-07-10/15:22:30 2013-7-10 15:25:58 621
执行时间约为3分28秒,更新数据6213551条

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-765975/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 笔记-创建profile
请登录后发表评论 登录
全部评论

注册时间:2011-11-23

  • 博文量
    148
  • 访问量
    396303