Oracle儲存過程刪除大批量資料

2021-08-27 17:12:09 字數 2892 閱讀 7497

參考:

批量刪除海量資料通常都是很複雜及緩慢的,方法也很多,但是通常的概念是:分批刪除,逐次提交。

下面是我的刪除過程,我的資料表可以通過主鍵刪除,測試過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...