Как указать пакетную фиксацию в операторе слияния Oracle?

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


person spaceman    schedule 16.02.2010    source источник


Ответы (2)


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

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

Честно говоря, дробление вашего единственного MERGE на большее количество операторов будет медленнее, так как выполняется больше работы — вы запускаете больше операторов, поэтому возникает больше накладных расходов на синтаксический анализ, и вы выполняете больше коммитов, поэтому для большей сериализации, поскольку ваша программа ожидает выполнения фиксации. Единственная веская причина для разделения одного оператора на несколько состоит в том, что у вас есть проблемы с возобновляемостью (О нет! Задание завершилось неудачно через три часа, а у нас было только четырехчасовое окно!) или если накладные расходы на управление транзакциями (ОТМЕНА и ) становится проблемой.

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

person Adam Musch    schedule 16.02.2010
comment
Адам, большое спасибо за ваш ценный ответ! - person spaceman; 02.03.2010

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

person user2455509    schedule 05.06.2013