在某次大批量操作後,資料記錄達到
100萬,
mobile_no
估計有2
萬個重複,現要求刪除重複的號碼(只保留一條),
因為該表是業務表,刪除時不能影響業務的正常使用。編寫儲存過程實現刪除重複號碼的功能。
要求如下: 1
、為保證刪除的資料以後可查,在刪除時要先做備份,備份不成功則不能進行刪除。 2
、要有日誌記錄,比如刪除所花時間,刪除成功了多少條,失敗多少條等操作資訊。
create or replace procedure prc_call is
type tp_info_id is table of number index by binary_integer;
v_info_id tp_info_id;
v_start_dt date;-- 開始時間
v_end_dt date;-- 結束時間
v_process_count number;-- 記錄刪除成功條數
begin
v_process_count := 0;
-- 讓備份和刪除,處於同乙個事務中
-- %sqlrowcount 得到sql執行次數
-- 將刪除的記錄重新插入表中
insert into call_book_info
(info_id, mobile_no, callin_time, callout_time, status)
select * from tt_backup_call_info;
commit;
--動態sql
execute immediate 'truncate table tt_backup_call_info';
---備份
insert into tt_backup_call_info
(info_id, mobile_no, callin_time, callout_time, status)
select info_id, mobile_no, callin_time, callout_time, status
from call_book_info t1
where t1.info_id not in (select max(t.info_id) maxid
from call_book_info t
group by t.mobile_no);
-- 開始時間
select sysdate into v_start_dt from dual;
-- 刪除
delete from call_book_info t
where t.info_id in (select t1.info_id from tt_backup_call_info t1);
v_process_count := sql%rowcount;
-- 結束時間
select sysdate into v_end_dt from dual;
-- 將刪除資訊進行記錄
insert into tmp_log
(log_id, start_dt, end_dt, process_tm, create_tm, process_count)
values
(seq_test_demo.nextval,
v_start_dt,
v_end_dt,
((v_end_dt - v_start_dt) * 24 * 60 * 60),
sysdate,
v_process_count);
commit;
end prc_call;
Oracle儲存過程刪除大批量資料
參考 批量刪除海量資料通常都是很複雜及緩慢的,方法也很多,但是通常的概念是 分批刪除,逐次提交。下面是我的刪除過程,我的資料表可以通過主鍵刪除,測試過delete和for all兩種方法,for all在這裡並沒有帶來效能提高,所以仍然選擇了批量直接刪除。操作如下 建立日誌記錄表 create ta...
Spring Hibernate處理大批量資料
原文 關於使用spring hibernate進行大批量資料的插入和更新,它的效能和使用jdbc preparedstatement的batch批量操作以及資料庫的儲存過程操作幾乎可以一樣高。在hibernate的官方文件裡說到了batchprocessing。spring hibernate大批量...
如何加速Oracle大批量資料處理
一 提高dml操作的辦法 簡單說來 暫停索引,更新後恢復.避免在更新的過程中涉及到索引的重建.批量更新,每更新一些記錄後及時進行提交動作.避免大量占用回滾段和或臨時表空間.建立一臨時的大的表空間用來應對這些更新動作 4 批量更新,每更新一些記錄後及時進行提交動作.避免大量占用回滾段和或臨時表空間.5...