从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;
主要想法是,这将减少还原保留。
问题,这是最佳做法吗?如果没有,任何指针?请帮助
在这种情况下,我会
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;
重新创建索引,约束(更好的是你保存它们之前下降);
这会更快,因为插入比删除更快。更多更快。
好的方法,你发现我的任何缺点? – 2013-04-08 07:49:58
你有关于large_id的索引吗? – 2013-04-08 08:21:20
是的,在large_id上有一个索引 – 2013-04-08 08:29:35
要永久DROP TABLE,如果数据的碱是10G使用吹扫
DROP TABLE LARGE_TABLE_OLD吹扫;
因为,从10g掉表可以更换,所以到delete it permanently,你需要使用清除。
感谢Bharath,我在11g上,我不会使用drop。 – 2013-04-09 13:05:05
“* UNDO保留*”是一个系统参数,用于指定(松散地说)UNDO表空间可以增长多少。它绝对不受任何交易的影响。您可能期望这会减小UNDO *表空间*的大小。 – 2013-04-08 07:26:41
我的理解是,当delete语句被触发时,直到有提交,删除的数据将在UNDO保留。我对么?如果是这样的话,那么这就造成了问题,因为数据非常庞大。 – 2013-04-08 07:31:57
你有问题吗?一个错误?或删除语句只是慢? – 2013-04-08 07:35:19