DO $$ DECLARE batch_size INT := 1000; last_id INT := 0; max_id INT; BEGIN SELECT MAX(id) INTO max_id FROM events WHERE processed_at IS NULL; WHILE last_id < max_id LOOP UPDATE events SET processed_at = NOW() WHERE id > last_id AND id <= last_id + batch_size AND processed_at IS NULL; COMMIT; last_id := last_id + batch_size; PERFORM pg_sleep(0.1); END LOOP; END $$;