Подведем итоги: нам нужно поместить приблизительно 5 миллионов строк в базу данных поставщика (Oracle). Все отлично подходит для пакетов по OracleBulkCopy
500 тыс. Строк с использованием (ODP.NET), но когда мы пытаемся масштабировать до 5M, производительность начинает снижаться, когда достигает отметки 1M, становится все медленнее по мере загрузки большего количества строк и, в конечном итоге, Тайм-аут через 3 часа или около того.
Я подозреваю, что это связано с первичным ключом на столе, но я тралял форумы Oracle и Переполнение стека для информации, и многое из того, что я читаю, противоречит этому (также, много сообщений, кажется, противоречат друг другу ) , Я надеюсь, что кто-то сможет установить рекорд по некоторым тесно связанным вопросам о процессе:
OracleBulkCopy
Использует ли класс обычную или прямую загрузку? Есть ли способ, которым я могу это подтвердить, так или иначе?Если предположить , что делает использование прямой путь загрузки: Верно ли , что Oracle автоматически устанавливает все индексы в непригодной во время загрузки и помещает их обратно в Интернете потом? Я прочитал несколько утверждений на этот счет, но, опять же, не могу подтвердить это.
Если # 2 истинно, то должно ли иметь значение, какие индексы есть в таблице, прежде чем я начну операцию массового копирования? Если так, то почему?
Относительно # 3, есть ли вообще практическая разница между массовой загрузкой с непригодным индексом и фактическим сбросом индекса перед загрузкой и его повторным созданием после этого?
Если # 2 это не правильно, или если есть некоторые оговорки я не понимающие, то он будет делать какое - либо различие в явном виде сделать индекс непригодным для использования до массовой загрузки, а затем явно восстановить его потом?
Есть ли что-то еще, кроме построения индексов, которое может привести к постепенному замедлению операции массового копирования по мере добавления большего количества записей? (Может быть, что-то делать с журналированием, хотя я ожидаю, что массовые операции не регистрируются?)
Если на самом деле нет другого способа поднять производительность, кроме как сначала сбросить PK / index, какие шаги я могу предпринять, чтобы убедиться, что индекс не исчезает полностью, т.е. если соединение с базой данных потеряно в середина процесса?