确切地说,我不是数据库人员,我的大部分数据库工作都是在MySQL上进行的,因此,如果此问题中的某些内容令人难以置信,请原谅我。
我需要从具有约1亿行的Oracle表中删除550万行。我在临时表中拥有需要删除的所有行的ID。如果只有几千行,我会这样做:
DELETE FROM table_name WHERE id IN (SELECT id FROM temp_table); COMMIT;
因为它有550万行,我是否需要了解和/或采取其他措施?我考虑过做一个循环,像这样:
DECLARE vCT NUMBER(38) := 0; BEGIN FOR t IN (SELECT id FROM temp_table) LOOP DELETE FROM table_name WHERE id = t.id; vCT := vCT + 1; IF MOD(vCT,200000) = 0 THEN COMMIT; END IF; END LOOP; COMMIT; END;
首先-这是否按照我的想法进行- 一次批处理200,000次提交?假设是这样,我仍然不确定生成550万条SQL语句并分批提交200,000条还是拥有一条SQL语句并一次全部提交是否更好。
有想法吗?最佳做法?
编辑 :我运行了第一个选项,即单个delete语句,并且仅用了2个小时就完成了开发。基于此,它已排队等待在生产环境中运行。
第一种方法更好,因为您可以向查询优化器清楚地了解要执行的操作,而不是试图隐藏它。数据库引擎在内部删除5.5m(或表的5.5%)时可能会采用与删除200k(或0.2%)时不同的方法。
这也是您可能需要阅读的有关Oracle中大规模DELETE的文章。