oracle 對錶中的記錄進行大批量刪除
oracle 對錶中的記錄進行大批量刪除數量時,常常採用分批刪除,逐次提交.其目的大概有三個原因:
1.避免對其他事務select的影響
如果其他事務有需要查詢這些要刪除的記錄,就需要去undo段查詢前映像.分批逐次可以減少行更新的時間,
以減少這種情況的發生.
2.避免各事務dml的鎖等待
如果要刪除的這些記錄上,有其他事務在做dml操作,就可能會產生相互的行鎖等待.分批逐次可以減少行鎖定的
時間,以減少這種情況的發生.
3.減少使用臨時表空間對效能產生的影響
在關聯刪除時,可能會用到sort或hash區,一次對大量記錄進行操作,如果sort_area_size或hash_area_size大小不
夠就會使用臨時表空間,效能會降低.分批逐次可以減少單次操作的記錄數,以減少這種情況的發生.
以下是一些對大批量刪除進行分批刪除逐次提交的程式碼,可根據自己的實際情況測試修改後實施.
--對無關聯的單表中的記錄按條件刪除
declare
n_count number;
n_rownum number:=10000;
begin
select count(*) into n_count from tb_detail where createdate
for i in 1..ceil(icount/irownum) loop
delete from tb_detail a
where createdate and rownum<=n_rownum ;
commit;
end loop;
end;
--對有關聯的表按條件刪除
declare
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_fid_to_delete dtArray;
n_delete number;
n_rownum number:=10000;
begin
select count(*)
into n_delete
from tb_main
where createdate < to_date('20140101', 'yyyymmdd');
for i in 1 .. ceil(n_delete / n_rownum) loop
select fid, rowid BULK COLLECT
INTO v_fid_to_delete, v_rowid
from tb_main
where createdate < to_date('20140101', 'yyyymmdd')
and rownum <= n_rownum;
forall j in 1 .. v_fid_to_delete.COUNT
delete from tb_detail where fid = v_fid_to_delete(j);
forall k in 1 .. v_rowid.COUNT
delete from tb_main where rowid = v_rowid(k);
commit;
end loop;
end;
--對有關聯的表按條件刪除子表或主表
declare
type dtArray is table of varchar2(50) index by binary_integer;
v_fid_to_delete dtArray;
n_delete number;
n_rownum number := 10000;
begin
select fid BULK COLLECT
INTO v_fid_to_delete
from tb_main
where createdate < to_date('20140601', 'yyyymmdd');
for i in 1 .. ceil(v_fid_to_delete.COUNT / n_rownum) loop
forall j in (i - 1) * n_rownum + 1 .. least(i * n_rownum,v_fid_to_delete.COUNT)
delete from tb_detail where fid = v_fid_to_delete(j);
commit;
end loop;
end;
1.避免對其他事務select的影響
如果其他事務有需要查詢這些要刪除的記錄,就需要去undo段查詢前映像.分批逐次可以減少行更新的時間,
以減少這種情況的發生.
2.避免各事務dml的鎖等待
如果要刪除的這些記錄上,有其他事務在做dml操作,就可能會產生相互的行鎖等待.分批逐次可以減少行鎖定的
時間,以減少這種情況的發生.
3.減少使用臨時表空間對效能產生的影響
在關聯刪除時,可能會用到sort或hash區,一次對大量記錄進行操作,如果sort_area_size或hash_area_size大小不
夠就會使用臨時表空間,效能會降低.分批逐次可以減少單次操作的記錄數,以減少這種情況的發生.
以下是一些對大批量刪除進行分批刪除逐次提交的程式碼,可根據自己的實際情況測試修改後實施.
--對無關聯的單表中的記錄按條件刪除
declare
n_count number;
n_rownum number:=10000;
begin
select count(*) into n_count from tb_detail where createdate
for i in 1..ceil(icount/irownum) loop
delete from tb_detail a
where createdate
commit;
end loop;
end;
--對有關聯的表按條件刪除
declare
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_fid_to_delete dtArray;
n_delete number;
n_rownum number:=10000;
begin
select count(*)
into n_delete
from tb_main
where createdate < to_date('20140101', 'yyyymmdd');
for i in 1 .. ceil(n_delete / n_rownum) loop
select fid, rowid BULK COLLECT
INTO v_fid_to_delete, v_rowid
from tb_main
where createdate < to_date('20140101', 'yyyymmdd')
and rownum <= n_rownum;
forall j in 1 .. v_fid_to_delete.COUNT
delete from tb_detail where fid = v_fid_to_delete(j);
forall k in 1 .. v_rowid.COUNT
delete from tb_main where rowid = v_rowid(k);
commit;
end loop;
end;
--對有關聯的表按條件刪除子表或主表
declare
type dtArray is table of varchar2(50) index by binary_integer;
v_fid_to_delete dtArray;
n_delete number;
n_rownum number := 10000;
begin
select fid BULK COLLECT
INTO v_fid_to_delete
from tb_main
where createdate < to_date('20140601', 'yyyymmdd');
for i in 1 .. ceil(v_fid_to_delete.COUNT / n_rownum) loop
forall j in (i - 1) * n_rownum + 1 .. least(i * n_rownum,v_fid_to_delete.COUNT)
delete from tb_detail where fid = v_fid_to_delete(j);
commit;
end loop;
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-1417272/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- 找回Oracle中Delete刪除的記錄Oracledelete
- 如何刪除oracle庫中相同的記錄Oracle
- Oracle如何刪除表中重複記錄Oracle
- Oracle中大批量刪除資料的方法Oracle
- Oracle 刪除表中重複記錄的DELETE SQLOracledeleteSQL
- 刪除Oracle重複記錄Oracle
- oracle刪除重複記錄Oracle
- 高效快速刪除Oracle表中重複記錄Oracle
- oracle-快速刪除重複的記錄Oracle
- Oracle中大批量刪除資料的方法(轉自)Oracle
- 【Oracle】對RID為偶數的記錄進行操作Oracle
- Oracle如何刪除表中重複記錄保留第一條Oracle
- MYSQL中刪除重複記錄的方法薦MySql
- 用SQL語言刪除表中的記錄SQL
- Oracle使用over()partition by刪除重複記錄Oracle
- 查詢刪除表中重複記錄
- 怎麼刪除電腦中開啟的檔案記錄?刪除電腦中開啟的檔案記錄方法教程
- ORACLE資料庫刪除表中記錄報record is locked by another userOracle資料庫
- 刪除不掉的資料記錄
- 刪除重複id的記錄
- 當查詢A表的時候,查詢還沒執行完,為什麼能夠對錶進行刪除?
- 使用者對某條賬單記錄的刪除操作
- 轉載:Oracle中查詢和刪除重複記錄方法簡介Oracle
- 使用oracle decode對錶字元列進行order by 排序Oracle字元排序
- db2中刪除重複記錄的問題DB2
- sql server 中刪除內容重複的某條記錄SQLServer
- mysql刪除一條記錄MySql
- Oracle 查詢並刪除重複記錄的SQL語句OracleSQL
- 在SQL Server中快速刪除重複記錄(轉)SQLServer
- openstack中徹底刪除計算節點的操作記錄
- windows10更新記錄刪除_怎樣刪除win10更新歷史記錄WindowsWin10
- 用“稽核物件”功能記錄檔案刪除記錄物件
- vue對table的某一行的資料進行編輯,刪除操作Vue
- Mongodb原始碼分析--刪除記錄MongoDB原始碼
- 記錄一下避免排序和刪除重複行排序