Comments 8
Есть что-то подобное для Postgres?
Скорее всего, в реальном проекте этот код в миграциях/вызовах в прикладном коде просто не пройдет код-ревью, так как разбираться в нем и поддерживать его очень сложно и дорого, а автору предложат переписать, разбив на несколько запросов и перенеся часть логики в прикладной код.
Для обновления или удаления миллионов записей в таблице БД под нагрузкой я сделал себе хранимую процедуру loop_execute()
, спрятав все "сложности" внутри. Взял идеи из статьи и развил дальше. Модификация записей происходит пачками в отдельных транзакциях с контролируемым временем блокировки. Для удобства есть режим тестирования, отображение прогресса выполнения в процентах и приблизительного времени окончания работы! На многоядерных серверах распараллеливание в разы увеличивает скорость работы.
PostgreSQL Antipatterns: обновляем большую таблицу под нагрузкой