1. 程式人生 > >刪除大量Oracle資料方法總結

刪除大量Oracle資料方法總結

Oracle中刪除超過50w條記錄的資料,如果直接使用delete,效率就嚴重受到了影響。那麼首先我們需要了解對於這個表的資料,我們到底是全部刪除,還是部分刪除。這裡有三個關鍵字我們需要注意:truncate,delete,drop,他們之間的異同點可以參考這篇文章——truncate,delete,drop的異同點

  全部刪除,不保留資料結構就直接drop最好。如果是部分刪除,一般就這樣一些辦法:

  1. 如果刪除的資料是大部分,分段提交刪除的資料。

create or replace procedure 
delete_table is i number(10); 
begin   
for
 x in (select * from emp where DEPTNO like ‘a%’)   
loop       
delete emp where emp.id = x.id i:=i+1;       
if i>1000 then          
commit;          
i:=0;       
end if;   
end loop; 
exception when others then dbms_out.put_line(sqlcode);
rollback
end delete_table;

  或者

–每500條資料提交一次DECLARE CNT NUMBER(10

):=0
I NUMBER(10); 
BEGIN 
SELECT COUNT(*) INTO CNT FROM ep_arrearage_bak 
WHERE TO_CHAR(DF_DATE,‘MM’)=’01′
FOR I IN 1..TRUNC(CNT/500)+1 
LOOP 
DELETE FROM ep_arrearage_bak WHERE TO_CHAR(DF_DATE,‘MM’)=’01′ ANDROWNUM<=500
COMMIT
END LOOP; 
END;

  2、把要保留的資料放在一個臨時表裡,truncate table原表後再放回來;

create table t_back as
 select * from t where ….
drop table t;
rename t_back to t;

   3. 專門使用一個大回滾段 ,比如定義:undo tablespace 2G

4、如果將方法1做一點修改,可以這麼做:

有條件的分步刪除資料表中的記錄 

–建立測試表 
create table test as select * from dba_objects;

–建立刪除表的儲存過程  
create or replace procedure deleteTab

–插入語句    
SQLinsert into test select * from dba_objects; 
6374 rows created. 
SQL> / 6374 rows created. 
SQL> / 6374 rows created. 
SQLcommit
– 建立刪除的儲存過程 
create or replace procedure deleteTab
/**    
** Usage: run the script to create the proc deleteTab    
**        in SQL*PLUS, type "exec deleteTab(‘Foo’,'ID>=1000000′,’3000′);"    
**        to delete the records in the table "Foo", commit per 3000 records.    
**       Condition with default value ’1=1′ and default Commit batch is 10000.    
**/   
(p_TableName in varchar2,    – The TableName which you want to delete from     
p_Condition in varchar2 default ’1=1′,    – Delete condition, such as "id>=100000"     
p_Count in varchar2 default ’10000′    – Commit after delete How many records)   
as pragma autonomous_transaction;    
n_delete number:=0;   
begin    
while 1=1 loop      
EXECUTE IMMEDIATE        
‘delete from ‘||p_TableName||‘ where ‘||p_Condition||‘ and rownum <= :rn’      
USING p_Count;      
if SQL%NOTFOUND then 
exit;      
else           
n_delete:=n_delete + SQL%ROWCOUNT;      
end if;      
commit;    
end loop;    
commit;    
DBMS_OUTPUT.PUT_LINE(‘Finished!’);    
DBMS_OUTPUT.PUT_LINE(‘Totally ‘||to_char(n_delete)||‘ records deleted!’);   
end;   /

–執行語句 
SQLexec deleteTab(‘TEST’,‘object_id >0′,’10000′)

   5、如果確認將來不需要做恢復,改為非歸檔模式,刪除完改回來再做個備份。這個方法我沒有實驗過。

  推薦使用第四種辦法。其實這些東西用google搜尋很多,但是都沒有註釋或者解釋。這裡做一個小小的總結。

相關推薦

刪除大量Oracle資料方法總結

Oracle中刪除超過50w條記錄的資料,如果直接使用delete,效率就嚴重受到了影響。那麼首先我們需要了解對於這個表的資料,我們到底是全部刪除,還是部分刪除。這裡有三個關鍵字我們需要注意:truncate,delete,drop,他們之間的異同點可以參考這篇文章——

總結一:Oracle 資料庫命令總結

一、日誌管理 1.強制日誌切換(forcing log switches) alter system switch logfile; 2.強制執行檢查點(forcing checkpoints) alter system checkpoint; 3.增加一個重做日誌組 (adding

java迴圈刪除List元素的方法總結

1、for迴圈 2、迭代器 3、過渡法 import java.util.*; /** * Created by HP on 2018/8/2. */ public class Test { public static void main(String[] args) {

js中刪除陣列元素的方法總結

子曰:“學而時習之,不亦說乎?” 雖然我覺得這裡的習字應該理解為實踐練習,而不是複習,但是這裡權當我理解錯了吧o(╯□╰)o。 今天就整理一下js中刪除陣列元素的方法,包括原生API和自定義API。 原生API: 刪除陣列最後一個元素,arr.pop(),並返回該元素,對原陣

OpenCV遍歷和輸出Mat矩陣中資料方法總結

一、Mat中影象畫素的訪問方式 1.ptr操作和指標-高效的方式 這種方式基於.ptr的操作,也是比較推薦的遍歷影象的方式。 1 2 3 4

Linq 語法/List列表、陣列處理資料方法總結(Chinar)

Linq List泛型資料陣列資料處理用法歸類 本文提供全流程,中文翻譯。 Chinar 堅持將簡單的生活方式,帶給世人!(擁有更好的閱讀體驗 —— 高解析度使用者請根據需求調整網頁縮放比例)

Vue2.0-元件間通訊、元件間傳遞資料方法總結(帶例子)

元件間通訊-傳遞資料 父元件給子元件傳遞資料,子元件需要設定props來宣告自己的預期資料,如果傳遞的資料有‘-’,子元件要用小駝峰形式接受: <div id="app">

oracle 高水位線詳解(刪除大量資料後續處理)

一、oracle 高水位線詳解 一、什麼是水線(High Water Mark)? 所有的oracle段(segments,在此,為了理解方便,建議把segment作為表的一個同義詞) 都有一個在段內容納資料的上限,我們把這個上限稱為"high water mark"或HWM。這個HWM是一個標記,

Oracle生成大量測試資料方法

Oracle生成一百萬測試資料的方法如下: 方法一:建立一個表,並同時新增1000000條資料,程式碼: create table TestTable as    select rownum as id,                  to_char(sy

Oracle批量、大量Update方法總結

  (1)主從兩個表,主表Student,有欄位id、name、sex,從表Boy,有欄位id、name,主從表同一物件id相同   (2)從表Boy的name屬性被業務修改,定時批量處理主表,以維持主表name屬性與從表一致 二、表結構: 1、主表 Student

總結刪除檔案或資料夾的7種方法-JAVA IO基礎總結第4篇

![](https://img2020.cnblogs.com/other/1815316/202009/1815316-20200901144138715-236578077.png) 本文是Java IO總結系列篇的第4篇,前篇的訪問地址如下: * [總結java中建立並寫檔案的5種方式-JAVA IO

[Oracle] 獲取運行計劃的各方法總結

mit statistic 另一個 waiting 長時間 trac process one ext 總的結論: 一.獲取運行計劃的6種方法(具體步驟已經在每一個樣例的開頭凝視部分說明了): 1. explain plan for獲取; 2. set aut

oracle下正確刪除表空間的方法

oracle tablespace Oracle因為本身的多重驗證機制所有在刪除表空間時不像MySQL中刪除database一樣,可以通過外部的刪除直接刪除掉database文件夾就可以刪除掉database,當然這兩者是2種不同的東西,在此僅用於舉例說明。在Oracle中表空間相當於系統中的硬

JAVA中循環刪除list中元素的方法總結

tor 循環 toolbar i++ 使用 修改 log span .get  印象中循環刪除list中的元素使用for循環的方式是有問題的,但是可以使用增強的for循環,然後今天在使用時發現報錯了,然後去科普了一下,再然後發現這是一個誤區。下面就來講一講。。伸手黨可直接跳

Java循環中刪除list中元素方法總結

bar del mov als lis remove for for循環 技術 JAVA中循環遍歷list有三種方式for循環、增強for循環(也就是常說的foreach循環)、iterator遍歷。 1、for循環遍歷list for(int i=0;i<li

Oracle字段增刪改方法總結

不兼容 name varchar2 rim 增刪改 HA table del alter 一、修改字段的語法:alter table tablename modify (字段名 類型 [default value][null/not null],….);有一個表名為tb,字

UML實踐經典教程(適合之前已經看過大量資料作為總結復習看)

join wid custom 作用 延伸 mmu 系列 http oob UML全名為:Unified Modeling Language。是程序語言面向對象之後大家認可的一種設計“圖紙”,往往在之前的使用過程中大家都覺得沒什麽必要投入學習也能看懂。這就是這類圖的優勢。

python 原生列表刪除元素方法總結

inf ima 技術 image rem move 方法 .com pytho 一、列表方法remove(),按值刪除,刪除首個符合的元素 二、列表方法pop(),按索引刪除,默認刪除最後一個元素 三、del函數,刪除

JAVA中循環刪除list中元素的方法總結(跳格刪除問題解決)(轉)

今天 src log 觸發 導致 spi als exceptio spa  印象中循環刪除list中的元素使用for循環的方式是有問題的,但是可以使用增強的for循環,然後今天在使用時發現報錯了,然後去科普了一下,再然後發現這是一個誤區。下面就來講一講。。伸手黨可直接跳至

javascript資料結構----關於陣列的方法總結

1.檢測陣列 對於一個網頁,或者一個全域性作用域而言,使用 instanceof 操作符就能到到滿意的結果: if (value instanceof Array){ //如果是陣列就執行某些操作 } instanceof 操作符的問題在於,他假定只有一個全域性執行環境。如果網頁中包含多