Как использовать DML во временной таблице Oracle без создания большого количества журнала отмен - PullRequest
4 голосов
/ 12 марта 2010

Использование временной таблицы Oracle не генерирует много журнала повторов, как обычной таблицы. Тем не менее, журнал отмены все еще генерируется. Таким образом, как я могу написать оператор вставки, обновления или удаления во временную таблицу, но Oracle не будет генерировать журнал отмены или генерировать как можно меньше?

Более того, использование / + append / в операторе вставки приведет к небольшому журналу отмен. Я прав? Если нет, может кто-нибудь объяснить мне, как использовать подсказку / + append /?

INSERT /*+APPEND*/ INTO table1(...) VALUES(...);

Ответы [ 3 ]

12 голосов
/ 12 марта 2010

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.

2 голосов
/ 12 марта 2010

Нашел по AskTom :

генерируют обычные пути вставки UNDO. они должны, вы должны быть возможность отката, нужно уметь для поддержки нескольких версий.

UNDO всегда защищен повтором.

Если вы направите глобальный путь временная таблица (вставка / * + APPEND * /) вы можете отменить отмену НА СТОЛБЕ, но не на индексах. Следовательно, вы можете уменьшить (незначительно, как обычно обычно это индексы, которые генерируют большинство отменить) количество возвратов, но вы не может устранить это.

0 голосов
/ 12 марта 2010

Полагаю, вы также можете получить некоторую выгоду от ключевого слова NOLOGGING .

Подсказка к добавлению предполагает, что Oracle должен использовать операции DIRECT-PATH, что может привести к более быстрой вставке. Если я правильно помню, у вас должен быть эксклюзивный доступ к столу. Важно выполнить коммит после вставки, чтобы вы могли выбирать из него информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...