需求簡介:生產數據庫一個表有27億多數據,要刪除其中其中2014年之前的歷史數據(大約4億左右),表信息:5個字段的主鍵、一個字段的單列索引、hash分區。
數據庫情況:每日1:00-9:00會跑增量數據程序,其他sql不能影響增量程序。(所以數據要在9:00-24:00之內跑完)
解決方案1:
delete /*+parallel(32)*/ from table_name where date<to_date('2014-01-01','yyyy-mm-dd');
結果:刪除了8個小時,才刪除幾千萬,怕影響第二天增量程序,直接殺進程,進程殺完數據回滾了20多小時,第二天增量最終還是影響了。
解決方案2(采用的):
--1,建分區表(如果不是分區表可以create...select) --2,插入數據 insert /*+parallel(32)*/ into table_name_new select /*+parallel(32)*/* from table_name where date>=to_date('2014-01-01','yyyy-mm-dd'); --3,創建索引 create index index_name1 on table_neme_new(column1) parallel 32; --4,索引並發創建要關閉並行,這樣在我們使用索引時會影響執行計划,也會消耗很多的資源。所以,我們需要對這個並行度進行修改,改成noparallel alter index index_name1 noparallel; --5,創建主鍵,由於創建主鍵不能開啟並行,所以要先創建主鍵字段唯一索引,再創建主鍵 create unique index pk_name1 on table_neme_new(column1,column2,...) parallel 32; alter index pk_name1 noparallel; alter table table_neme_new add constraint pk_name1 primary key(column1,column2,...);
--6,核對數據量沒問題,將老表rename其他名字,將新表rename老名字
結果:插入數據3.5小時,建單列索引40分鍾,建主鍵40分鍾。達到可以接受范圍。