oracle大表刪除數據方案


需求簡介:生產數據庫一個表有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分鍾。達到可以接受范圍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM