问题描述
我想从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)
所以,我看到两种方法。
-
从符合删除条件的作业执行中找到最大作业ID,然后将其除以10,并循环10次以从6个表中删除(作业执行和相应的子表步骤记录)。使用相同的批量更新
-
使用每个表中的spring批处理更新,使用batch选项删除批处理,并为Spring批处理提供批处理大小以进行批处理删除。我认为这种方法比方法1需要更多的时间。
解决方法
在每个计费周期之后,我们都有数百万个数据,并且具有sql过程,该过程具有所有带有FK引用的表,并在for循环中进行迭代。这是由一个单独的Job调用的。我认为这种情况下的解决方案应基于业务运营活动以及执行频率。