3

我有一个表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%)。因此,将我想要保留的数据复制到另一个表中并删除重新创建表可能不是最好的解决方案。

4

1 回答 1

4

我只能想到两种方法来加快速度。

  1. 如果您定期执行此操作,则应考虑按月对表进行分区。然后,您只需删除要删除的月份的分区。这基本上和丢一张桌子一样快。如果我没记错的话,分区需要企业许可证
  2. 使用要保留的数据创建一个新表(使用create table new_table as select ...),删除旧表并重命名临时表。这会快得多,但缺点是您需要在新表上重新创建所有索引和(主键、外键)约束。
于 2013-09-22T21:40:08.337 回答