Как я могу указать Batch commit в Oracle Merge Statement?

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

2 ответа

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

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

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

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

Вы не можете иметь пакетную фиксацию для одного оператора слияния.

Другие вопросы по тегам