Влияет ли время COMMIT и ROLLBACK на производительность? - PullRequest
3 голосов
/ 03 сентября 2010

Предположим, у меня есть набор идентификаторов. Для каждого идентификатора я буду вставлять множество записей во многие разные таблицы на основе идентификатора. Между вставкой таблиц различий будут вызываться различные бизнес-проверки. Если какая-либо проверка завершится неудачно, все записи, вставленные на основе этого идентификатора, будут ROLLBACK. Это массовое действие вставки выполняется с использованием PL / SQL. Влияет ли время COMMIT и ROLLBACK на производительность и как оно влияет? Например, должен ли я COMMIT после завершения процесса для одного ID или COMMIT после завершения всех ID?

Ответы [ 5 ]

10 голосов
/ 03 сентября 2010

Это не столько решение о производительности, сколько решение о разработке процесса. Вы хотите, чтобы другие идентификаторы оставались в базе данных, когда вам нужно откатить ошибочный идентификатор?

По понятным причинам откат занимает больше времени, когда нужно откатить больше строк. Откат обычно занимает больше времени (иногда намного дольше!), Чем операции, которые необходимо откатить. Коммит в Oracle всегда быстр, поэтому, вероятно, не имеет значения, как часто вы делаете коммит в этом отношении.

4 голосов
/ 03 сентября 2010

В описании проблемы указано, что у вас большой набор логических транзакций меньшего размера (каждый новый идентификатор является транзакцией). Вы должны совершить каждую логическую транзакцию. Две причины ждать, чтобы зафиксировать весь набор транзакций:

  1. Если весь набор транзакций фактически является самой транзакцией - все операции вставки должны быть успешными для фиксации любых строк. В этом контексте ваши меньшие «транзакции» не являются настоящими транзакциями.
  2. У вас нет возможности перезапуска в процессе массовой загрузки, что фактически делает это частным случаем пункта 1. Если ваш процесс массовой загрузки прерывается, вам нужен способ пропустить успешно примененные идентификаторы.

Том Кайт советует совершать каждую логическую единицу работы - транзакцию.

0 голосов
/ 03 сентября 2010

Один из вариантов, если вам нужно контролировать отдельные наборы, но при этом сохранить возможность зафиксировать или откатить всю транзакцию, это использовать точки сохранения.Вы можете установить точку сохранения в начале самого внешнего цикла, а затем вернуться к ней в случае ошибки.Вы можете получить что-то вроде этого:

begin
   --Initial batch logging
   for r_record in cur_cursor loop
      savepoint s_cursor loop;
      begin
         --Process rows
      exception
         when others then
            rollback to s_cursor;
      end;
   end loop;
   --Final batch logging
exception
   when others then
      rollback;
      raise;
end;
0 голосов
/ 03 сентября 2010

Есть две "силы" на работе ....

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

  2. синхронная запись каждый коммит выполняет синхронную запись. (есть способы отключить это, но обычно это то, что каждый хочет: целостность). эта синхронная запись может занять (намного) больше времени, чем обычная запись (которая может быть буферизована). Не стоит забывать, что обычно существует дополнительный обход в сети, связанный с фиксацией.

итак, одна сила говорит «совершать как можно быстрее (учитывая ваши требования целостности)», другая говорит «совершать как можно реже».

Есть и другие вопросы, которые следует рассмотреть, например, максимальный размер транзакции. каждая незафиксированная транзакция требует некоторого временного пространства. чем больше транзакция, тем больше вам нужно. Вы также можете столкнуться с ORA-01555 «Снимок слишком старый».

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

0 голосов
/ 03 сентября 2010

Не занимайте больше времени транзакции. сделайте это как можно короче. Потому что по вашему запросу были созданы некоторые блокировки. Эти блокировки могут вызвать проблемы с производительностью ... так что делайте это по идентификатору ...

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