Oracle 10g大表大批量升级提升

Oracle 10g大表大批量升级提升 |频道:Debian|点一下: 次

Oracle 10g大表大批量升级提升,实际上,七百万的表算不上大表,做为检测可以了

一,t表信息内容
SQL alter table t add is_del number(1);
SQL alter table t modify is_del default 0;

SQL desc t
Name  Type  Nullable Default Comments
------ --------- -------- ------- --------
ID  NUMBER  Y 
CODE  NUMBER  Y 
IS_DEL NUMBER(1) Y  0

SQL select count(*) from t;
 
  COUNT(*)
----------
  7136976

二,以便较为标准的一致性,先缓存文件t数据信息
update t set t.is_del = 0;

三,这儿共小结了4种方式
SQL set timing on
--0
SQL update t set t.is_del = 0;

7136976 rows updated.

Elapsed: 00:08:28.64

--1
SQL declare
  2  rnt pls_integer := 0;
  3  begin
  4  for idx in (select rowid rid from t) loop
  5  update t set t.is_del = 0 where rowid = idx.rid;
  6  rnt := rnt + 1;
  7  if mod(rnt,2000) = 0 then
  8  commit;
  9  end if;
 10  end loop;
 11  commit;
 12  end;
 13  /

PL/SQL pleted.

Elapsed: 00:09:41.32
SQL

--2
SQL declare
  2  rnt pls_integer := 0;
  3  begin
  4  for idx in (select rowid rid from t) loop
  5  update t set t.is_del = 0 where rowid = idx.rid;
  6  rnt := rnt + 1;
  7  if rnt = 2000 then
  8  rnt := 0;
  9  commit;
 10  end if;
 11  end loop;
 12  commit;
 13  end;
 14  /

PL/SQL pleted.

Elapsed: 00:09:35.67

--3
SQL declare
  2  cursor cur_t is select rowid rid from t;
  3  type tab_t is table of urowid index by binary_integer;
  4  l_rid tab_t;
  5  begin
  6  open cur_t;
  7  loop
  8  fetch cur_t bulk collect into l_rid limit 2000;
  9  forall idx in 1 .. l_rid.count
 10  update t set t.is_del = 0 where rowid = l_rid(idx);
 11  commit;
 12  exit when cur_t%notfound;
 13  end loop;
 14  close cur_t;
 15  end;
 16  /

PL/SQL pleted.

Elapsed: 00:06:48.84

根据上边的检测結果能看到,方式3最好,方式0不提议应用,这会使undo迅速提高,出現ora-01555不正确。方式1和方式2在一些书本上见到过检测,说方式2好于方式1,但我此次检测实际效果模糊不清显,之后再开展一些检测。

注:
检测的数据信息库配备了闪回特点,db_recovery_file_dest_size=2g,存档系统日志放到db_recovery_file_dest文件目录中。刚开始时的升级实际操作,redo提高迅速,经常hang住了,alert log报室内空间不够,全部提升了db_recovery_file_dest_size=4g。也有要留意undo表室内空间的监管。



扫描二维码分享到微信