Oracle требуется отменить информацию для отката DML в транзакции. Как говорит Гари в своем комментарии:
"Отмена необходима для отката
последствия одного заявления, если оно
проваливается на полпути. Это также
необходимо предусмотреть ROLLBACK TO
SAVEPOINT или ROLLBACK (хотя для
ГЛОБАЛЬНЫЕ ВРЕМЕННЫЕ СТОЛЫ последние
будет иметь отношение только к сессии
продолжительность ГТЦ). "
Эта информация UNDO сама генерирует REDO. Вы ничего не можете с этим поделать: временные таблицы нуждаются в отмене, и на этом все.
Уменьшить количество отката довольно просто: просто вставьте записи и выберите записи. INSERT генерирует наименьшее количество UNDO, потому что откат INSERT требует просто rowid. И наоборот, операторы DELETE генерируют больше всего UNDO, потому что база данных должна хранить всю запись. В основном, чтобы откатить INSERT, введите DELETE, чтобы откатить DELETE, выполните INSERT. UPDATE генерирует переменную величину UNDO, потому что нам нужны старые версии измененных столбцов; чем больше столбцов изменилось и чем они больше, тем больше генерируется UNDO.
Демонстрационный
В первом сеансе пользователь вставит много записей во временную таблицу, а затем удалит их. Во втором сеансе администратор БД будет отслеживать использование транзакции UNDO.
SSN1> insert into gtt23
2 select * from big_table
3 /
553928 rows created.
SSN1>
Отменить использование:
SSN2> select space, noundo, used_ublk, used_urec from v$transaction
2 /
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 257 10816
SSN2>
Теперь удаление:
SSN1> delete from gtt23
2 /
553928 rows deleted.
SSN1>
Отменить использование (несколько примеров во время длительной инструкции) ::
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 11123 435605
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 13413 525452
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 14552 570567
SSN2>
Фиксация (временная таблица имеет область транзакции, т.е. УДАЛИТЬ СТРОКИ)
SSN1> commit
2 /
Commit complete.
SSN1>
Отменить использование:
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
no rows selected
SSN2>
Использование отмены накопление :
SSN1> insert into gtt23
2 select * from big_table
3 /
553928 rows created.
SSN1> delete from gtt23
2 /
553928 rows deleted.
SSN1> insert into gtt23
2 select * from big_table
3 /
553928 rows created.
SSN1>
Отменить использование
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 258 10816
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 14766 579495
SSN2> r
1* select space, noundo, used_ublk, used_urec from v$transaction
SPA NOU USED_UBLK USED_UREC
--- --- ---------- ----------
NO NO 14819 581685
SSN2>
Резюме
Итак, чтобы минимизировать влияние UNDO, которое генерирует временная таблица, убедитесь, что вы вставили правильные данные один раз. Избегайте применения обновлений к нему и особенно избегайте удаления большого количества записей из них. Если вы используете временную таблицу с областью транзакции, на самом деле не нужно удалять записи из нее. Если ваша временная таблица имеет продолжительность сеанса, и вам нужно ее очистить, было бы лучше использовать TRUNCATE, если это возможно, а не DELETE.