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 ?