在Oracle 11g中执行批量DELETE操作

时间:2013-09-22 21:35:24

标签: sql oracle oracle11g sql-delete bulk

我有一个表MyTable,其中包含多个带有日期的int列和一个包含日期的列。日期列的索引创建如下

CREATE INDEX some_index_name ON MyTable(my_date_column)

因为通常会在用户指定的日期范围之间查询表的内容。该表没有指向它的外键,也没有除主键之外的任何其他索引,主键是由序列/触发器填充的自动递增索引。

现在,我遇到的问题是这个表上的数据经常被替换一段时间,因为它已经过时了。因此,更新方式是删除给定时间段内的所有条目并插入新条目。删除是使用

执行的
DELETE FROM MyTable 
WHERE my_date_column >= initialDate 
  AND my_date_column < endDate

但是,由于删除的行数很大(从500万行到1200万行),程序在删除过程中几乎都会阻塞。

我可以禁用某些东西来加快操作速度吗?或者可以在索引中指定一个选项以使其更快?我读过一些关于重做空间的事情,但是我不知道在操作过程中如何禁用它。

编辑:该过程每天运行并删除最近5天的数据,然后它会带来这5天的数据(可能已在外部源中更改)并重新插入数据。

与表中的全部数据(<1%)相比,删除的数据量很小。因此,将要保留的数据复制到另一个表中并删除 - 重新创建表可能不是最佳解决方案。

1 个答案:

答案 0 :(得分:4)

我只能想到两种方法来加速这个。

  1. 如果您定期执行此操作,则应考虑按月对表进行分区。然后,您只需删除要删除的月份的分区。这基本上和丢桌子一样快。如果我没弄错的话,分区需要企业许可
  2. 使用您要保留的数据创建一个新表(使用create table new_table as select ...),删除旧表并重命名interims表。这将更快,但缺点是您需要在新表上重新创建所有索引和(主键,外键)约束。