2013-04-08 111 views
0

哪種方法可以從表中刪除大型記錄?我有要求每週從表格中刪除約3000萬條記錄。 問題在於,有一個UNDO保留問題。我打算將我的刪除語句分解爲塊,以便它有所幫助。表從Oracle中刪除大量數據

當前語句

DELETE FROM LARGE_TABLE WHERE LARGE_ID ='someValue'; 

詳情:

1。表將有大約70萬條記錄。

2.刪除會影響至少40-45%的表格。

3.表格沒有分區。

規劃的語句改爲

LOOP  

DELETE FROM LARGE_TABLE WHERE LARGE_ID ='someValue' and ROWNUM <'some row number'; 
COMMIT; 
select count(1) INTO nCountValue from LARGE_TABLE WHERELARGE_ID ='someValue' ; 
EXIT WHEN nCountValue = 0; 

END LOOP; 

主要想法是,這將減少還原保留。

問題,這是最佳做法嗎?如果沒有,任何指針?請幫助

+1

「* UNDO保留*」是一個系統參數,用於指定(鬆散地說)UNDO表空間可以增長多少。它絕對不受任何交易的影響。您可能期望這會減小UNDO *表空間*的大小。 – 2013-04-08 07:26:41

+0

我的理解是,當delete語句被觸發時,直到有提交,刪除的數據將在UNDO保留。我對麼?如果是這樣的話,那麼這就造成了問題,因爲數據非常龐大。 – 2013-04-08 07:31:57

+1

你有問題嗎?一個錯誤?或刪除語句只是慢? – 2013-04-08 07:35:19

回答

2

在這種情況下,我會

CREATE TABLE LARGE_TABLE_NEW AS 
SELECT * FROM LARGE_TABLE 
WHERE LARGE_ID <> 'someValue'; 

rename LARGE_TABLE to LARGE_TABLE_old; 

Rename LARGE_TABLE_new to LARGE_TABLE; 

驗證什麼是確定的,然後,

drop table LARGE_TABLE_OLD; 

重新創建索引,約束(更好的是你保存它們之前下降);

這會更快,因爲插入比刪除更快。更多更快。

+0

好的方法,你發現我的任何缺點? – 2013-04-08 07:49:58

+0

你有關於large_id的索引嗎? – 2013-04-08 08:21:20

+0

是的,在large_id上​​有一個索引 – 2013-04-08 08:29:35

0

要永久DROP TABLE,如果數據的鹼是10G使用吹掃

DROP TABLE LARGE_TABLE_OLD吹掃;

因爲,從10g掉表可以更換,所以到delete it permanently,你需要使用清除。

+0

感謝Bharath,我在11g上,我不會使用drop。 – 2013-04-09 13:05:05