Skip to content

Latest commit

 

History

History

loop_execute

loop_execute() — safely modifies millions of rows in a table

English:

Update or delete rows incrementally in batches with multiple separate transactions. This maximizes your table availability since you only need to keep locks for a short period of time. Also allows dead rows to be reused. There is a progress of execution in percent and a prediction of the end work time!

Russian:

Процедура для обработки строк в больших таблицах (тысячи и миллионы строк) с контролируемым временем блокировки строк на запись.

Принцип работы — выполняет в цикле CTE DML запрос, который добавляет, обновляет или удаляет записи в таблице. На каждой итерации цикла обрабатывается некоторое количество записей из таблицы. Количество обрабатываемых записей автоматически вычисляется исходя из ограничения по длительности работы каждой итерации цикла. Т.о. запросы на каждой итерации цикла автоматически адаптируются под нагрузку на БД. В завершении каждого цикла изменения фиксируются (либо откатываются для целей тестирования, это настраивается). На реплику данные передаются постепенно небольшими порциями, а не одним огромным куском. В процессе обработки показывает в psql консоли:

  • количество модифицированных и обработанных записей в таблице
  • сколько времени прошло, сколько примерно времени осталось до завершения, прогресс выполнения в процентах

Прогресс выполнения в процентах для работающего процесса отображается ещё в колонке pg_stat_activity.application_name!

Внимание! Процедура не предназначена для выполнения в транзакции, т.к. сама делает много маленьких транзакций.