OracleBulkCopy против SQL * Производительность загрузчика - PullRequest
8 голосов
/ 02 февраля 2012

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

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

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

OracleBulkCopy занимает около 10 минут для загрузки всего 1 млн. Строк.

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 07 февраля 2012

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

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

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

1 голос
/ 17 февраля 2012

Эта проблема также возникает при использовании DataTable в качестве источника? Или это связано только с использованием IDataReader?

...