我们在数据库中有一些无用的历史数据,这些数据在数据库中总计高达<1.9亿(19亿亿)行,贡献了33 GB。现在我有一个任务就是一次性删除这些行,如果在任何情况下出现故障,我应该能够回滚事务。
我将基于一些标志来选择它们,例如已删除='1',从我的估计数到2亿的1.9亿。所以首先我必须做一个select操作,然后删除那些id。
如this文章中所述,删除150万条记录需要4个小时,这个记录远远少于我的情况,我想知道我是否继续采用单一删除方法需要多长时间才能删除删除1.9亿条记录。
我应该使用Spring-Batch来选择行的id,然后逐批删除它们,或者通过在IN
子句中传递id来发出单个语句。
请建议什么是更好的方法。
答案 0 :(得分:1)
为什么不将所需数据从历史表移动到新表并完全删除旧表?您可以稍后将新表重命名为旧表名。
答案 1 :(得分:1)
您可以将所需的数据从历史表复制到新表并完全删除旧表,然后将新表重命名为旧表名 - 正如Raj在上面的帖子中所述。这是最好的方法。
并且您还可以使用nologging和parallel选项来加速,例如:
创建表History_new parallel 4 nologging as 从历史记录中选择/ * + parallel(source 4)* / *,其中col1 = 1和...;
答案 2 :(得分:0)
如果在Java中执行它不是必需的,我将创建一个PL / SQL过程,打开游标并使用DELETE ... WHERE CURRENT OF。也许它不是超级快,但它是安全的,因为你没有回滚段问题。即使没有事务,使用普通的DELETE也是一个原子操作,如果出现故障必须回滚。
答案 3 :(得分:0)
也许你所说的通常和正常的Java性能,但在我的笔记本上删除1M记录需要大约一分钟 - 当然没有Java。
如果你想做得好,我说你应该使用分区。首先,将普通表转换为具有所有数据的分区表(一个(当前)分区)。然后,准备&#34;历史&#34;分区并将不必要的数据移入其中。之后你就可以做任何事了。您可以将其移至离线状态(但需要时进行恢复),您可以使用EXCHANGE PARTITION在几秒钟内排除此数据,依此类推。