从表中删除大型记录的最佳方法是哪种?我有一个要求,我需要每周从表中删除大约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的保留率。
问题,这是最好的做法吗?如果没有,任何指针?请帮忙
答案 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,你需要使用清除。