Периодически необходимо удалять или обновлять большие объёмы строк из таблиц. Например при архивировании ненужных данных прошлых периодов. Как правило, база настроена на текущие, относительно небольшие задачи , не требующих больших сегментов отката, и при большом удалении или обновлении можно наткнуться на ошибку о нехватке места в сегменте отката.
Чаще всего в такой ситуации разбивают удаляемые/обновляемые массивы строк на небольшие фрагменты по какому то принципу, и в цикле, по удалению/изменению фрагмента, выполняют COMMIT.
Это не совсем правильный подход. Если неудачно выбрать принцип фрагментирования массива строк, то можно наткнуться на следующую ситуацию:
Как избежать такой ситуации ?
Самый правильный вариант - создать большой сегмент отката, который будет использоваться только в подобных случаях. Держать его в отключенном состоянии и, при необходимости, включать. Алгоритм получается такой:
Если такой вариант невозможен, то можно разбить массив строк по rowid, то есть удалить/обновить все нужные строки из одного блока, затем из другого и т.д. Через нужное количество обработанных блоков отрабатывать commit.