Postgresql
June 12, 2022
Update порциями по N строк в цикле PL/pgSQL.
Используются данные из демонстрационной базы https://postgrespro.ru/education/demodb, пример вымороченный, но ничего лучше в голову не пришло.
create table bookings.bookings_temp as SELECT book_ref, book_date, total_amount, localtimestamp upd_date FROM bookings.bookings;
В таблице всего 2 111 110 строк.
Далее (понятный без комментариев) код апдейта таблицы bookings_temp в цикле с фиксацией изменений по 50000 строк (переменная v_batch_qt). Кстати, для Oracle код будет на 99% таким же:
DO $
declare
v_cnt int := 0;
v_rec record;
v_batch_qt int := 50000;
begin
for v_rec in (select book_ref from bookings.bookings_temp)
loop
update bookings.bookings_temp t1
set book_date = t0.book_date + interval '9 minutes'
,upd_date = localtimestamp
FROM bookings.bookings t0
where t0.book_ref = t1.book_ref and t0.book_ref = v_rec.book_ref;
v_cnt := v_cnt + 1;
if v_cnt >= v_batch_qt then
v_cnt :=0;
--exit;
commit;
end if;
end loop;
commit;
RAISE NOTICE 'финиш (%)',v_cnt;
end;
$;
Посмотрим, сколько всего порций закоммитилось.
select count (distinct upd_date) qt from bookings.bookings_temp
Вернулось 43 строки, т.е. были зафиксированы 42 изменения по 50 000 строк и одно на 1110.