日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle大表如何快速删除一列,Oracle 对表中的记录进行大批量删除

發布時間:2025/3/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle大表如何快速删除一列,Oracle 对表中的记录进行大批量删除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 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;

本文永久更新鏈接地址:,

本文原創發布php中文網,轉載請注明出處,感謝您的尊重!

總結

以上是生活随笔為你收集整理的oracle大表如何快速删除一列,Oracle 对表中的记录进行大批量删除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。