OracleBulkCopy vs SQL * производительность загрузчика

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

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

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

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

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

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

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

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

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

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

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

  • действительно ли OracleBulkCopy выполняет функцию инструмента массовой загрузки?

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

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

2 ответов


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

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

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


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