參考:
批量刪除海量資料通常都是很複雜及緩慢的,方法也很多,但是通常的概念是:分批刪除,逐次提交。
下面是我的刪除過程,我的資料表可以通過主鍵刪除,測試過delete和for all兩種方法,for all在這裡並沒有帶來效能提高,所以仍然選擇了批量直接刪除。
操作如下:
--建立日誌記錄表
create table tb_archive_log_running
(proc_name varchar2(30) null,
proc_desc varchar2(255) null,
table_name varchar2(255) null,
rec_time date null,
proc_result varchar2(30) null
);--記錄日誌儲存過程
create or replace procedure "p_write_runlog" (i_proc_name in varchar2,
i_proc_desc in varchar2,
i_table_name in varchar2,
i_rec_time in date,
i_proc_result in varchar2) is
begin
insert into tb_archive_log_running
(proc_name, proc_desc, table_name, rec_time, proc_result)
values
(i_proc_name, i_proc_desc, i_table_name, i_rec_time, i_proc_result);
commit;
exception
when others then
insert into tb_archive_log_running
(proc_name, proc_desc, table_name, rec_time, proc_result)
values
(i_proc_name, i_proc_desc, i_table_name, i_rec_time, '寫日誌出錯');
commit;
end p_write_runlog;
例1:--刪除id區間資料儲存過程
--引數 p_tablename 表名
--引數 p_max 要刪除的最大id
--引數 p_min 要刪除的最小id
create or replace procedure delete_table
( p_tablename in varchar2,
p_max in number,
p_min in number ) is
x number(20);
t_name varchar2(100);
begin
p_write_runlog('deletebegin','刪除資料從:'||p_min||'到:'||p_max,p_tablename,sysdate,'info');
x := p_min;
t_name := p_tablename;
while x + 1000 < p_max loop
x := x + 1000;
execute immediate 'delete from '||t_name||' where id < '||x;
commit;
end loop;
p_write_runlog('deleteend','刪除資料從:'||p_min||'到:'||p_max,p_tablename,sysdate,'info');
end delete_table;
--執行 引數:表名,最大id,最小id
exec delete_table('report_netunit_inte***ces' ,6000,3000 );
例2:--刪除指定**p_num條資料
create or replace procedure delete_table_num (
p_tablename in varchar2,
p_num in number ) is
p_min number(20);
p_max number(20);
t_name varchar2(100);
x number(20);
begin
execute immediate 'select min(id) from '|| p_tablename into p_min;
p_max := p_min + p_num;
p_write_runlog('deletebegin','刪除資料從:'||p_min||'到:'||p_max,p_tablename,sysdate,'info');
x := p_min;
t_name := p_tablename;
while x + 1000 < p_max + 1 loop
x := x + 1000;
execute immediate 'delete from '||t_name||' where id < ' || x;
commit;
end loop;
p_write_runlog('deleteend','刪除資料從:'||p_min||'到:'||p_max,p_tablename,sysdate,'info');
end delete_table_num;
exec delete_table_num ('report_netunit_inte***ces',1000);
Oracle儲存過程處理大批量資料
在某次大批量操作後,資料記錄達到 100萬,mobile no 估計有2 萬個重複,現要求刪除重複的號碼 只保留一條 因為該表是業務表,刪除時不能影響業務的正常使用。編寫儲存過程實現刪除重複號碼的功能。要求如下 1 為保證刪除的資料以後可查,在刪除時要先做備份,備份不成功則不能進行刪除。2 要有日誌...
大批量刪除 如何解決大批量資料儲存的效能問題
一 背景在行業中所有基於實體的orm框架,均存在同乙個問題 在批量運算元據時,效能表現乏力。因為在批量儲存資料時,可能既包含新增的記錄,又包含更新或刪除的記錄,一般的orm框架必須為每一條記錄生成一條sql語句,然後一條一條的執行,這樣執行的效能非常差,而通常的優化方案是將資料分批儲存,但在資料量特...
Linux rm刪除大批量檔案
在使用rm刪除大批量檔案時,有可能會遭遇 引數列太長 argument list too long 的問題。如下所示 bash bin rm argument list too long 檢視總共有多少個這類檔案,如下所示,總共有8348個檔案 oracle db server bdump ls l...