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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- delete和truncate刪除的區別delete
- [20180409]delete刪除緩慢分析.txtdelete
- Shift + Delete刪除的檔案如何恢復?delete
- mysql支援跨表delete刪除多表記錄MySqldelete
- Linux命令curl去操作delete去刪除資源Linuxdelete
- python 使用 delete 方法時報錯,可以正常刪除Pythondelete
- MySQL防止delete命令刪除資料的兩種方法MySqldelete
- 使用delete刪除陣列,其長度會改變嗎?delete陣列
- win10 shift delete刪除的檔案如何恢復Win10delete
- SAP ABAP OData 服務如何支援刪除(Delete)操作試讀版delete
- 什麼?還在用delete刪除資料《死磕MySQL系列 九》deleteMySql
- Mysql資料庫delete刪除後資料恢復報告MySql資料庫delete資料恢復
- 單表的更新UPDATE和刪除記錄DELETE(二十六)delete
- Oracle快速找回被刪除的表Oracle
- 快速刪除node_modules資料夾
- Linux如何快速刪除大量碎小檔案?Linux
- win10怎麼找回shift delete刪除的檔案_win10按shiftdelete刪除的檔案如何恢復Win10delete
- MYSQL下如何安全的快速刪除大表MySql
- 如何快速刪除Word中的頁首橫線?刪除頁首橫線技巧分享
- 簡單幾步教你win10按delete鍵刪除不提示的方法Win10delete
- 面試題: 資料庫:delete和trancate刪除表記錄的區別面試題資料庫delete
- win10如何刪除局快速訪問專案_win10系統怎樣刪除快速訪問記錄Win10
- 探索vim之如何快速刪除檔案內容
- Mac實用技巧:如何設定長按delete實現連續刪除小技巧!Macdelete
- [20200414]Linux下快速刪除大量檔案(補充).txtLinux
- php(js)批量刪除/單個刪除PHPJS
- IDEA外掛:快速刪除Java程式碼中的註釋IdeaJava
- 想要在Mac上快速刪除照片背景,快用Super PhotoCutMac
- 檔案快速刪除工具, 解決你的node_modules
- 工作293:調節刪除順序刪除
- [20231130]快速刪除大量檔案測試(perl版本)3.txt
- mysql刪除主鍵索引,刪除索引語法MySql索引
- win10系統怎麼使用CMD命令快速刪除超大資料夾 win10利用CMD命令快速刪除超大資料夾的步驟Win10大資料
- win10如何刪除快速訪問_win10快速訪問怎麼關閉Win10
- leetcode 450. delete-node-in-a-bst 刪除二叉搜尋樹中的節點 python3LeetCodedeletePython
- iOS 多選刪除(附tableViewTips及單選刪除)iOSView
- 刪除資料
- 刪除歸檔
- Gitlab刪除分支Gitlab