Извлечение-преобразование-загрузка из Oracle в SQL Server с помощью C#

#c# #oracle #sql-server-2005 #parallel-processing #etl

#c# #Oracle #sql-server-2005 #параллельная обработка #etl

Вопрос:

Я болтался вокруг SO пару дней и нашел сообщество отличным! Я уверен, что кто-нибудь может высказать мне мнение по моему вопросу:

У нас есть необработанные данные на сервере Oracle, и наш запрос извлекает около 312 МБ данных (только те столбцы, которые нам нужны, соединенные в нескольких таблицах). Это делается с использованием Oracle.DataAccess.Client , FetchSize = RowSize * 512 , который составляет около 3,9 МБ. В настоящее время я использую OracleDataReader и выполняю обработку в его while() цикле.

Затем результаты обработки записываются с использованием подготовленных параметризованных IF EXISTS() UPDATE ELSE INSERT . Из этой базы данных мы можем возвращать необходимые нам данные непосредственно в Excel после объединения таблиц измерений.

Я ищу способы повысить производительность. Возможно ли многопоточность BULK INSERT s и UPDATE s, а также многопоточность обработки строк (скажем, запустить 4 потока и равномерно разделить входящие строки между ними) и существует ли что-то подобное BULK UPDATE в SQL Server 2005?

Я не ищу код для копирования-вставки, меня больше интересуют уже существующие рекомендации или шаблоны.

С наилучшими пожеланиями,

Ответ №1:

Я не уверен, что вам даст разделение входящих строк между потоками, учитывая, что все они должны быть вставлены в одну и ту же целевую таблицу. Вставка в базу данных, вероятно, будет узким местом, и несколько потоков на клиенте, вероятно, просто будут ждать друг друга.

Моим обычным подходом для этого было бы использовать SqlBulkCopy для чтения строк из OracleDataReader и вставки их в пустую промежуточную таблицу в целевой базе данных.

Затем обрабатывайте промежуточную таблицу пакетами, повышая ее в целевой таблице. Каждый пакет будет транзакцией.

Комментарии:

1. Я предполагаю, что тогда это OracleDataReader реализуется IDataReader , но будет ли это означать, что я должен выполнять все преобразования данных в SQL? Или я могу как-то перегрузить OracleDataReader , чтобы он возвращал уже вычисленные столбцы? 1 за то, что рассказал мне о SqlBulkCopy и MERGE !

2. Да, это означало бы, что вам нужно выполнить преобразования в SQL — например, в запросе Oracle. Если вы не можете этого сделать, альтернативой может быть написание вашего собственного класса-оболочки вокруг OracleDataReader, который реализует IDataReader и выполняет нужные вам преобразования.

3. Итак, вставка в DB действительно была узким местом. Спасибо за ваши замечательные предложения, я принимаю ответ!