LARGE DELETE快速刪除
看了ITPUB出的9I最佳化中《如何給Large Delete操作提速近千倍?》,今天做了個測試。
需求:刪除表serviceinfo中sellername重複的記錄,LOGINID為主鍵
伺服器:IBM336 1G記憶體(少了點)
資料量:
SQL> select count(*) from serviceinfo;
COUNT(*)
----------
827275
--------將重複記錄插入TMP表
create table serviceinfo_bak as select * from serviceinfo;
--建立臨時表
create table serviceinfo_TMP as select * from serviceinfo where rownum<1;
create index IDX_LCT2 on serviceinfo_TMP (LOGINID) tablespace GOU_IDX;
--原表增加索引
create index idx_serviceinfo_name on serviceinfo (sellername) tablespace GOU_IDX;
--插入要刪除的重複記錄
insert into serviceinfo_tmp
select a.*
from serviceinfo a
where rowid not in (select max(rowid)
from serviceinfo b
where a.sellername = b.sellername);
180527 rows inserted
Executed in 48.312 seconds
commit;
臨時表資料量
SQL> select count(*) from serviceinfo_tmp;
COUNT(*)
----------
180527
一、測試直接用一個語句刪除
SQL> delete from serviceinfo where serviceinfo.loginid in (select loginid from serviceinfo_tmp);
180527 rows deleted
Executed in 247.297 seconds
二、使用最佳化方法
--建立刪除過程del_serviceinfo_seg、del_serviceinfo_all
create or replace procedure del_serviceinfo_seg as
--1、分段刪除,每次10000條
--2、使用BULK COLLECT子句,提高SELECT效能
--3、使用FORALL子句,提高DML效能
type ridArray is table of rowid index by binary_integer;
type dtArray is table of varchar2(50) index by binary_integer;
v_rowid ridArray;
v_mid_to_delete dtArray;
begin
select loginid, rowid bulk collect
into v_mid_to_delete, v_rowid
from serviceinfo_tmp
where rownum < 10001;
forall i in 1 .. v_mid_to_delete.COUNT
delete from serviceinfo where loginid = v_mid_to_delete(i);
forall i in 1 .. v_rowid.COUNT
delete from serviceinfo_tmp where rowid = v_rowid(i);
end;
/
create or replace procedure del_serviceinfo_all as
--迴圈刪除所有記錄
i number;
begin
select count(*) into i from serviceinfo_tmp;
while i > 0 loop
begin
EXECUTE IMMEDIATE 'begin del_serviceinfo_seg;end;';
commit;
i := i - 10000;
end;
end loop;
--最後一次刪除,刪除不足10000條的記錄
EXECUTE IMMEDIATE 'begin del_serviceinfo_seg;end;';
commit;
end;
/
SQL> exec del_serviceinfo_all;
PL/SQL procedure successfully completed
Executed in 186.11 seconds
說明:資料量不大時,最佳化的效果不太明顯 247.297 seconds -- 186.11 seconds 提高了約25%
由於伺服器效能的限制,沒有再進一步測試,相信資料量越大,最佳化的效果越明顯。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69204/viewspace-45358/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle delete 分批刪除Oracledelete
- Elasticsearch增刪改查 之 —— Delete刪除Elasticsearchdelete
- delete和truncate刪除的區別delete
- delete_partition.pl 刪除分割槽delete
- 找回Oracle中Delete刪除的記錄Oracledelete
- 快速刪除oracle物件Oracle物件
- 主外來鍵關聯刪除(on delete set null和on delete cascade)deleteNull
- mysql支援跨表delete刪除多表記錄MySqldelete
- Shift + Delete刪除的檔案如何恢復?delete
- javascript delete運算子刪除array陣列元素JavaScriptdelete陣列
- python 使用 delete 方法時報錯,可以正常刪除Pythondelete
- delete/truncate刪除資料索引空間問題delete索引
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- MySQL防止delete命令刪除資料的兩種方法MySqldelete
- Oracle 刪除表中重複記錄的DELETE SQLOracledeleteSQL
- Oracle閃回查詢恢復delete刪除資料Oracledelete
- [20140505]刪除直方圖_delete histogram直方圖deleteHistogram
- Oracle中審計刪除(DELETE)操作的觸發器Oracledelete觸發器
- update,delete與INNER JOIN 以及刪除重複資料delete
- Linux命令curl去操作delete去刪除資源Linuxdelete
- oracle 快速刪除和快速插入的方法之一Oracle
- Oracle快速找回被刪除的表Oracle
- win10 shift delete刪除的檔案如何恢復Win10delete
- javascript delete刪除屬性的注意點簡單介紹JavaScriptdelete
- [20180409]delete刪除緩慢分析.txtdelete
- 快速刪除excel中的空行和列Excel
- Mysql資料庫delete刪除後資料恢復報告MySql資料庫delete資料恢復
- 單表的更新UPDATE和刪除記錄DELETE(二十六)delete
- SAP ABAP OData 服務如何支援刪除(Delete)操作試讀版delete
- 什麼?還在用delete刪除資料《死磕MySQL系列 九》deleteMySql
- C++中動態建立和刪除陣列(new 和delete)C++陣列delete
- Solaris系統刪除硬Raid中的卷:delete volume方法AIdelete
- 表管理之四:刪除資料Delete與truncate的使用區別delete
- [CareerCup] 2.3 Delete Node in a Linked List 刪除連結串列的節點delete
- ASM 中使用RMAN delete archivelog until time刪除歸檔檔案ASMdeleteHive
- 檢視oracle 資料庫中的級聯刪除(delete cascade)Oracle資料庫delete