【发布时间】:2013-09-27 17:50:47
【问题描述】:
我有一个表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 天的数据(可能在外部源中已更改)并重新插入数据。
删除的数据量与表中的全部数据量相比只是很小的一部分(
【问题讨论】:
-
行的哪一部分实际发生了变化。如果您要删除 5 天的数据,然后重新插入 5 天的数据,您是否可以重写该过程以执行
MERGE而不是DELETE+INSERT?删除期间有哪些“块”?SELECT语句永远不会被 DML 阻止。也许应用程序变慢(呃)是因为DELETE使您的 I/O 子系统饱和?还是您的应用程序试图锁定您的DELETE进程正在删除的行? -
哦,Brian,我已经有几个月没有从事那个项目了,所以我再也找不到了。我不确定 Oracle 本身的问题是什么,但我们转移到了 PostgreSQL,并且在那里进行相同的操作要快得多。这就是我们“解决”它的方式。
标签: sql oracle oracle11g sql-delete bulk