Я вижу некоторые существенные различия в производительности между 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 работает как основная массаинструмент загрузки?
Что-то мне нужно настроить, чтобы заставить его работать должным образом?(настройки клиента / сервера и т. д.)
Любая помощь очень ценится.