如何在Spring Boot Jdbc中从具有批处理大小的多个表中执行批处理删除

问题描述

我想从6个表中删除,它们有数百万条记录。。所以我要分批删除。目前我使用jdbcTemplate.batchUpdate(deleteQueryArray)

有时候这可能会导致死锁,所以我想批量删除x,这会很好地缩放。

查询

DELETE FROM BATCH_STEP_EXECUTION_CONTEXT 
WHERE STEP_EXECUTION_ID IN (SELECT BE.STEP_EXECUTION_ID 
                            FROM BATCH_STEP_EXECUTION BE 
                            JOIN BATCH_STEP_EXECUTION_CONTEXT BEC ON BE.STEP_EXECUTION_ID = BEC.STEP_EXECUTION_ID  
                            WHERE LAST_UPDATED < '2020-11-01 00:00:00'),DELETE FROM BATCH_STEP_EXECUTION 
WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID 
                           FROM BATCH_JOB_EXECUTION 
                           WHERE LAST_UPDATED < '2020-11-01 00:00:00'),DELETE FROM BATCH_JOB_EXECUTION_ParaMS 
WHERE JOB_EXECUTION_ID IN (SELECT JOB_EXECUTION_ID 
                           FROM BATCH_JOB_EXECUTION  
                           WHERE LAST_UPDATED < '2020-11-01 00:00:00')

DELETE FROM BATCH_JOB_EXECUTION 
WHERE LAST_UPDATED < '2020-11-01 00:00:00'

DELETE FROM BATCH_JOB_INSTANCE 
WHERE JOB_INSTANCE_ID NOT IN (SELECT JOB_INSTANCE_ID 
                              FROM BATCH_JOB_EXECUTION)

所以,我看到两种方法

  1. 从符合删除条件的作业执行中找到最大作业ID,然后将其除以10,并循环10次以从6个表中删除(作业执行和相应的子表步骤记录)。使用相同的批量更新

  2. 使用每个表中的spring批处理更新,使用batch选项删除批处理,并为Spring批处理提供批处理大小以进行批处理删除。我认为这种方法方法1需要更多的时间。

有人可以分享您的想法吗,什么是最好的方法 谢谢

解决方法

在每个计费周期之后,我们都有数百万个数据,并且具有sql过程,该过程具有所有带有FK引用的表,并在for循环中进行迭代。这是由一个单独的Job调用的。我认为这种情况下的解决方案应基于业务运营活动以及执行频率。