一尘不染

在Oracle中删除大量数据

sql

确切地说,我不是数据库人员,我的大部分数据库工作都是在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个小时就完成了开发。基于此,它已排队等待在生产环境中运行。


阅读 156

收藏
2021-03-17

共1个答案

一尘不染

第一种方法更好,因为您可以向查询优化器清楚地了解要执行的操作,而不是试图隐藏它。数据库引擎在内部删除5.5m(或表的5.5%)时可能会采用与删除200k(或0.2%)时不同的方法。

这也是您可能需要阅读的有关Oracle中大规模DELETE的文章

2021-03-17