Сравнение OracleBulkCopy и SQL*Loader Performance

Я вижу значительные различия в производительности между OracleBulkCopy (ODP.NET) и SQL*Loader, когда сервер Oracle находится на другом компьютере.

У меня есть очень простая таблица в Oracle с тремя столбцами (один BINARY_FLOAT, два NUMBER (18,0)). Нет первичных ключей, индексов, триггеров и т. д. Он используется как промежуточная таблица для загрузки больших объемов данных в БД.

SQL*Loader загружает в таблицу 4,5 миллиона строк примерно за 27 секунд.

OracleBulkCopy требуется около 10 минут, чтобы загрузить всего 1 миллион строк.

OracleBulkCopy, согласно документации, *"...использует подход загрузки по прямому пути, который похож на Oracle SQL*Loader, но не совпадает с ним."* Он может не сравниться с SQL*Loader с точки зрения производительности. , но эта разница смехотворна.

После базового анализа сетевого трафика я обнаружил, что OracleBulkCopy отправляет и получает огромное количество небольших пакетов. Я использовал Wireshark для сравнения пакетов для каждого из них и нашел несколько интересных результатов.

SQL*Loader — после начального подтверждения соединения — отправляет серию пакетов 8 килобайт (протокол TNS) и получает в ответ 60-байтовые подтверждения.

OracleBulkCopy отправляет серию пакетов размером 102 байта (протокол TNS) и получает в ответ пакет 133 байта (протокол TNS). Что за...!? Как будто он отправляет одну строку за раз!

С классом OracleBulkCopy я использую размер пакета 100 000 и использую пользовательский IDataReader для чтения из файла данных.

Итак, мои вопросы:

  • Кто-нибудь когда-нибудь видел такое поведение?

  • Действительно ли OracleBulkCopy работает как инструмент массовой загрузки?

  • Есть ли что-то, что мне нужно настроить, чтобы заставить его работать правильно? (настройки клиент/сервер и т.д.)

Любая помощь очень ценится.


person Adrian Brown    schedule 02.02.2012    source источник
comment
У меня аналогичные времена вставки с использованием таблицы данных. Хуже того, пара столбцов имеет тип timestamp, поэтому я должен установить для столбца datatable тип OracleTimeStamp, который также, похоже, хорошо работает при профилировании приложения. Удалось ли вам ускорить массовое копирование? Вызов командной строки для запуска sqlloader кажется очень плохим способом обработки больших файлов на веб-сервере!   -  person Dan    schedule 21.11.2012


Ответы (1)


Я получил ответ от Алекса Кеха, менеджера по продуктам Oracle, что Oracle «также заметила эту проблему. Мы оцениваем, как исправить эту ошибку».

Итак, отвечая на мои собственные вопросы, я предполагаю, что OracleBulkCopy плохо работает как инструмент массовой загрузки. По крайней мере, не сейчас.

Я буду обертывать SQL*Loader в качестве альтернативного решения, так как нет ETA для исправления ошибки.

person Adrian Brown    schedule 07.02.2012
comment
Из любопытства, пробовали ли вы привязку массива? - person Branko Dimitrijevic; 07.02.2012
comment
Да, мы используем привязку массива для большей части загрузки данных. Однако в данном конкретном случае мы загружаем в базу данных десятки миллионов строк данных, и нам не нужно много логики вокруг этого — просто быстрая загрузка и привязка массива недостаточно быстры. - person Adrian Brown; 07.02.2012
comment
@AdrianBrown - Если вы все еще следите за этой веткой, помните ли вы, какая версия и где были какие-либо обновления по исправлению ошибок? - person Leigh; 21.03.2016
comment
@Leigh - Извините, я не помню, какая версия. В конце мне надоело ждать, так что еще раз, не знаю, исправлена ​​​​ли ошибка. В итоге мы все равно перешли на SQL Server, но по совершенно другим причинам. :) - person Adrian Brown; 01.04.2016
comment
@AdrianBrown - Нет проблем, это было довольно давно. Спасибо, что вернулись ко мне! - person Leigh; 01.04.2016