从Oracle删除大量数据

时间:2013-04-08 07:21:59

标签: performance oracle

从表中删除大型记录的最佳方法是哪种?我有一个要求,我需要每周从表中删除大约3000万条记录。 问题在于,存在UNDO保留问题。我打算将我的删除语句分解为块,以便它可以提供帮助。

当前声明

DELETE FROM LARGE_TABLE WHERE LARGE_ID ='someValue';

表格详情:

1.Table将有大约7000万条记录。

2.Delete将影响至少40-45%的表。

3.Table未分区。

计划将声明更改为

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;

主要思想是这会降低UNDO的保留率。

问题,这是最好的做法吗?如果没有,任何指针?请帮忙

2 个答案:

答案 0 :(得分: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;

重新创建索引,约束(最好在删除之前保存它们);

这会更快,因为插入比删除更快。更快。

答案 1 :(得分:0)

永久地降低表,如果您的数据库是10G使用清除

drop table LARGE_TABLE_OLD purge;

因为,从10g掉落的表可以被替换,因此到delete it permanently,你需要使用清除。