需求簡介:生產資料庫乙個表有27億多資料,要刪除其中其中2023年之前的歷史資料(大約4億左右),表資訊:5個字段的主鍵、乙個欄位的單列索引、hash分割槽。
資料庫情況:每日1:00-9:00會跑增量資料程式,其他sql不能影響增量程式。(所以資料要在9:00-24:00之內跑完)
解決方案1:
delete/*+parallel(32)
*/from table_name where date2014-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分鐘。達到可以接受範圍。
Oracle大量刪除資料方案
觀點一 create or replace procedure delete table isi number 10 begin for x in select from emp where deptno like a loop delete emp where emp.id x.id i i 1 ...
oracle刪除資料
oracle在表中刪除資料的語法是 語法結構 delete from表名 where 條件 演示 sql delete from infos where stuid s100103 1 row deleted sql commit truncate 在資料庫操作中,truncate命令 是乙個ddl...
oracle刪除資料釋放表空間流程
生產環境 資料庫裡空間不足,niptest 表空間251g,只使用了17g 再alter database datafile niptest1 resize 10g 的時候說超出了範圍要求 由於表變動比較頻繁,高水位值比較大 高水位 hwm high water mark oracle中block有...