提到刪除表的字段,我們最初想到的就是alter table xx drop column field1;
但是當我們要對生產環境中大數據量的表進行刪除字段,而且不是刪除一個兩個,有可能刪除多個字段,此方法是否可取。網上有文章說到可以先對要刪除的字段進行unused的處理,然后在系統不忙的時候執行drop column,我個人認為此方法不是不可行,只不過我認為不是最快的。
我以我自己親身處理的一個例子,介紹下我的方法,僅供參考。
文章開始前,先講一下背景。
客戶生產環境中數據量增量很大,每個月都要有五六十G的增量。尤其是幾個大表,數據量每月都是千萬級增量。由于歷史原因,有的表中的字段多達200多個,但實際用到的字段也就只有七八十個,也就是有一百二三個字段要干掉,進行優化。
千萬級的數據表,要干掉一百二三十個字段,而且還要盡可能的不影響業務的運行。那就要求在業務最不繁忙的時候,以最快的速度處理完,怎么辦。
下面介紹下我的方法。
舉個例子,然后上腳本吧。
假如有個表A,A中的數據量是5000w以上,A中有200個字段,你要刪掉其中的120個字段。
腳本如下:
------------------腳本開始-----------------
-- 創建臨時表create table A_temptablespace ATEMPnologgingas select field1,field2,,,,field80 -- 此處需要整理出A中要保留的字段
from A;
/-- 刪除原表drop table A;-- 重命名表ALTER TABLE A_temp RENAME TO A;-- 使用nologging以及parallel快速重新添加索引create index IND_Afile on A(field2) tablespace ATEMP nologging parallel 6;
alter table A add constraint PK_field PRimary key (field1) using index tablespace ATEMP nologging;
------------------腳本結束-----------------
我自己試驗的結果是5000w的數據表,三分鐘內可以搞完。
新聞熱點
疑難解答