天天看點

oracle大資料量删除方案

oracle進行大資料量删除的時候,容易報錯表temp表空間空間不夠導緻删除失敗,此時的處理方案有:

方案一:

分批删除,送出之後繼續執行

方案二:

當剩下的資料量小于待删除的資料量時,可以使用轉表的方式來實作。這裡重點介紹轉表的方案。

步驟一、導出表結構

進入PL/SQL DEVELOPER【工具】-【導出使用者對象】,選擇表所屬的模式,選擇表,導出到指定檔案。

步驟二、修改對象的名稱,包括:表名,索引名,限制名

步驟三、執行表建立的語句,不執行create table之外的語句,特别是索引和限制不執行

步驟四、将保留的資料插入到新表,執行下面腳本可以獲得表字段拼接的語句

create table chl_tab_define(fseq number,ftablename varchar2(500),fcolumn varchar2(500));
--輸入表名
--輸出一定格式的sql
declare ftab varchar2(500);
ftab_org varchar2(500);
fnum number;
FSEQ_var NUMBER;
fcol VARCHAR2(5000);
fsql varchar2(30000);
begin
delete from chl_tab_define;
select 'T_BAS_VOUCHERENTRY_CHL','T_BAS_VOUCHERENTRY',1,' ',' '  into ftab,ftab_org,FSEQ_var,fcol,fsql from dual;
insert into  chl_tab_define(fseq,ftablename,fcolumn)
select row_number() over (order by column_id),table_name,column_name 
FROM USER_TAB_COLS WHERE TABLE_NAME=ftab_org;
select count(1) into fnum from chl_tab_define;
while FSEQ_var<fnum LOOP
select  fcol||fcolumn||',' into fcol from   chl_tab_define where fseq=FSEQ_var and ftablename=ftab_org;
SELECT  FSEQ_var+1 INTO FSEQ_var FROM DUAL;
END LOOP;
select fcol||fcolumn into fcol from   chl_tab_define where fseq=FSEQ_var and ftablename=ftab_org;
select 'insert into '||ftab||'('||fcol||')
select '||fcol||'
from '||ftab_org||' where 
alter table '||ftab_org||' rename to '||ftab_org||'org;
alter table '||ftab||' rename to '||ftab_org||';
drop table '||ftab_org||'org;' into fsql   from dual;
dbms_output.put_line(fsql);
end;
           

上面結果輸出的腳本,隻取 insert into select...where...語句,進行保留資料的插入

步驟五、繼續執行新表索引和限制的建立SQL

步驟六、取步驟四的後部分腳本修改表名