#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 действительно была узким местом. Спасибо за ваши замечательные предложения, я принимаю ответ!