海量資料處理_表結構變更

redhouser發表於2011-05-31

問題:
隨著應用的演變,需要對大表結構進行調整,這裡主要討論刪除列、增加列兩種情況。

注意:對於大表,進行較大的維護操作後,需要對錶進行重構,對索引重構,重新收集統計資訊。

1,刪除列
1.1對於大表(3000萬記錄),直接刪除列(alter table t drop column)耗時比較長,可能存在中斷恢復問題。使用checkpoint(alter table t drop column ...checkpoint ),增加提交次數。如果失敗,處於不可用狀態,需要使用DROP COLUMNS CONTINUE。
alter table users drop(
  LOGIN_NAME,
  USER_TYPE,
  PASSWORD,
  STATUS,
  LOGIN_STATUS,
  LOGIN_DATE,
  CHANGE_PASSWORD,
  LOGIN_ERROR,
  ERROR_TIMES,
  ERROR_DAYS,
  REG_TYP
) checkpoint 10000;

--Elapsed: 00:26:44.95


1.2使用set unused可以很快完成邏輯刪除,在系統空閒時,使用drop unused columns物理刪除。
alter table users set unused(
  LOGIN_NAME,
  USER_TYPE,
  PASSWORD,
  STATUS,
  LOGIN_STATUS,
  LOGIN_DATE,
  CHANGE_PASSWORD,
  LOGIN_ERROR,
  ERROR_TIMES,
  ERROR_DAYS,
  REG_TYP
);
alter table users drop unused columns checkpoint 100000;

2,增加列
如果新增加列有預設值,需要較大的回滾段,處理時間也較長。
測試中,在記錄1000萬行時,需要回滾段大概1G。可以分步處理:
--增加列
alter table payee add(FIXED_ACT varchar2(1));

--設定新增行的預設值
alter table payee modify(FIXED_ACT default '0');

--設定已有行的預設值
alter session enable parallel dml;
update /*+ parallel(t 8) */ payee t set fixed_act='0' where fixed_act is null;
commit;
alter session disable parallel dml;

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18922393/viewspace-696734/,如需轉載,請註明出處,否則將追究法律責任。

相關文章