Как стать автором
Обновить

PostgreSQL Antipatterns: обновляем большую таблицу под нагрузкой

Время на прочтение 6 мин
Количество просмотров 26K
Всего голосов 14: ↑14 и ↓0 +14
Комментарии 8

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

В MySQL для этого есть готовые утилиты — например pt-online-schema-change.
Есть что-то подобное для Postgres?
Эта утилита немного про другое:
pt-online-schema-change alters a table’s structure without blocking reads or writes.
Я именно про блокировки UPDATE/UPDATE писал.
Прочитал еще раз и понял.
Какие кошмарные запросы
Есть альтернативное решение для той же задачи?

Скорее всего, в реальном проекте этот код в миграциях/вызовах в прикладном коде просто не пройдет код-ревью, так как разбираться в нем и поддерживать его очень сложно и дорого, а автору предложат переписать, разбив на несколько запросов и перенеся часть логики в прикладной код.

А какой из приведенных запросов настолько сложен, что «разбираться в нем и поддерживать его очень сложно и дорого»? Это, скажем так, не высшая математика, а уровень средней школы.

Хотя, если ревьюер на SQL ничего сложнее SELECT * FROM ... WHERE ... не писал, то проблемы у него возникнут, конечно.

Для обновления или удаления миллионов записей в таблице БД под нагрузкой я сделал себе хранимую процедуру loop_execute(), спрятав все "сложности" внутри. Взял идеи из статьи и развил дальше. Модификация записей происходит пачками в отдельных транзакциях с контролируемым временем блокировки. Для удобства есть режим тестирования, отображение прогресса выполнения в процентах и приблизительного времени окончания работы! На многоядерных серверах распараллеливание в разы увеличивает скорость работы.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий