从Oracle中删除大量数据

从Oracle中删除大量数据

问题描述:

哪种方法可以从表中删除大型记录?我有要求每周从表格中删除约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

在这种情况下,我会

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

要永久DROP TABLE,如果数据的碱是10G使用吹扫

DROP TABLE LARGE_TABLE_OLD吹扫;

因为,从10g掉表可以更换,所以到delete it permanently,你需要使用清除。

+0

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