Как выполнить пакетное удаление из нескольких таблиц с размером пакета в spring boot jdbc

#spring-boot #spring-batch #spring-jdbc #jdbctemplate

#spring-boot #spring-batch #spring-jdbc #jdbctemplate

Вопрос:

Я хочу удалить из 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)
  

Итак, я вижу 2 подхода.

  1. найдите максимальный идентификатор задания из выполнения задания, подлежащего удалению, а затем разделите его на допустим, коэффициент 10 и выполните цикл 10 раз, чтобы удалить из 6 таблиц (выполнение задания и соответствующие записи шагов дочерней таблицы). используя одно и то же пакетное обновление

  2. Используя пакетное обновление spring из каждой таблицы, используйте опцию batch для удаления и укажите размер пакета для Spring batch для пакетного удаления. Я думаю, что этот подход займет больше времени, чем подход 1.

Может кто-нибудь, пожалуйста, поделитесь своей мыслью, каков наилучший подход здесь, спасибо

Комментарии:

1. Почему это приводит к тупиковой ситуации? Вы выполняете эти запросы в одной транзакции?

Ответ №1:

После каждого цикла выставления счетов у нас есть миллионы данных, и у нас есть процедура sql, в которой есть все таблицы со ссылками FK и итерации в цикле for. Это вызывается отдельным заданием. Я думаю, что решение в этом случае должно основываться на операционной деятельности бизнеса и на том, как часто это необходимо выполнять.

Комментарии:

1. Это должно выполняться один раз в день. Это обычное действие по очистке старых данных.