Как я могу указать Batch commit в Oracle Merge Statement? - PullRequest
1 голос
/ 16 февраля 2010

Я делаю массовую вставку / обновление для миллионов записей, используя инструкцию MERGE в oracle. Что ж, другие варианты могут заключаться в использовании FORALL с использованием BULKCOLLECT и последующей фиксации, но эта операция снова замедлит производительность, так как мне нужно держать цикл. Фиксация после завершения всей операции слияния будет ударом по производительности, я хотел бы знать, как я могу поместить частоту коммитов в оператор слияния для каждых, скажем, 10000 строк вставки / обновления чего-то вроде пакетной фиксации.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010

Оператор MERGE - это один оператор, поэтому он не может по определению охватывать транзакции. (A в ACID означает атомарность.)

Если у вас нет индексов по критериям слияния (предложение ON) для исходной и целевой таблиц, то превращение одного оператора MERGE в N операторов слияния будет выполняться значительно медленнее, чем при выполнении одного Сканирование против источника и / или цели, вы будете делать N из них. Если вы думали, что одно полное сканирование таблицы было медленным, попробуйте выполнить 100 для каждого миллиона строк!

Честно говоря, разделение вашего единственного MERGE на большее количество операторов будет медленнее, так как выполняется больше работы - вы выполняете больше операторов, поэтому возникает больше накладных расходов на анализ и вы выполняете больше коммитов, так что будет больше сериализации, так как ваша программа ожидает выполнения коммита. Единственная веская причина для разделения одного оператора на несколько - это если у вас есть проблемы с восстановлением (О, нет! Задание не было выполнено три часа, а у нас было только четыре часа!) Или если накладные расходы на управление транзакциями (UNDO и ORA-01555 ) становится проблемой.

Если у вас есть доступность ЦП для этого процесса, вы можете рассмотреть возможность использования подсказки PARALLEL для вашего оператора MERGE, чтобы проверить, работает ли он быстрее. Точно так же, если ваш оператор MERGE влияет только на часть строк в целевой таблице, возможно, индекс для столбцов, с которыми объединяются, улучшит производительность.

0 голосов
/ 05 июня 2013

У вас не может быть пакетной фиксации для одного оператора слияния.

...