Я создал приложение с Spring Boot и JPA для переноса базы данных Jira postgres.
В основном у меня 5000 пользователей, которые мне нужно перенести.Каждый пользователь имеет в виду 67 запросов на обновление в разных таблицах.
Каждый запрос использует функцию LOWER для сравнения регистра игнорирования.
Некоторый псевдокод:
for (user : users){
for (query : queries) {
jdbcTemplate.execute(query.replace(user....
Я игнорирую любыеошибки, поэтому, если один запрос завершается неудачно, я все равно продолжаю и выполняю другой 66.
Я выполняю это в 10 отдельных потоках, и каждому пользователю требуется примерно 120 секунд для перехода.(20 потоков привели к мертвой блокировке базы данных)
В этом темпе потребуется больше суток, что недопустимо (я выполняю это в тестовой среде, прежде чем приступить к работе).
Запросы выглядят так:
UPDATE table SET column = 'NEWUSERNAME' where LOWER(column) = LOWER('CURRENTUSERNAME');
Что я могу сделать, чтобы попытаться оптимизировать эту миграцию?
ОБНОВЛЕНИЕ: Я изменил свой подход.Сначала я выбираю каждый элемент с именем CURRENTUSERNAME и получаю его идентификатор.Затем я создаю запросы UPDATE, используя идентификатор в качестве предложения where.
Кроме этого, выполнение по-прежнему занимает много времени (4+ часа).Я запускаю миллионы обновлений, каждый за раз.Я знаю, что у jdbcTemplate есть метод массовых операций, но если происходит сбой одного UPDATE, я считаю, что он также откатывает каждое успешное обновление.Кроме того, я не знаю об улучшении производительности, которое было бы, если таковое имеется.
Итак, чтобы обновить вопрос, учитывая, что у меня есть миллионы запросов UPDATE, что было бы лучшим способом выполнить их?(объем, многопоточность, что-то еще)