Несколько улучшений производительности обновления - PullRequest
0 голосов
/ 27 мая 2019

Я создал приложение с 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, что было бы лучшим способом выполнить их?(объем, многопоточность, что-то еще)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...