У меня есть таблица MSSQL 2008 с несколькими миллионами записей. Мне нужно перебирать каждую строку, изменять некоторые данные и копировать обновленную запись в новую таблицу, используя приложение C #, которое выполняется каждый день.
Я попытался сделать это с использованием сущностей ADO.NET, но есть проблемы с памятью, связанные с этим методом, не говоря уже о том, что он очень медленный. Я прочитал библиотеки массового копирования и методы только для SQL для копирования одной таблицы в другую, но ни один из них не требует изменения записей перед их копированием. Мне нужно найти лучший способ для выполнения этой операции.
Когда вы упоминаете проблемы с памятью, я предполагаю, что вы пытаетесь загрузить миллионы строк в память, обработать их, а затем записать их обратно в базу данных. Вы можете избежать этого путем «потоковой передачи» данных, а не загрузки его полностью. SqlDataReader
будет обрабатывать буферизацию для вас, поэтому на стороне чтения вы можете сделать простой цикл WHILE
который выбирает строки один за другим. Фактическое преобразование, которое у вас уже работает, кажется таким, что все, что вам нужно сделать, это позаботиться о том, чтобы вернуть результаты в базу данных. IMHO - самый быстрый способ сделать это: хранить в таблице данных буфер с несколькими результатами (начинать с 100, обрабатывать и видеть, где находится сладкое пятно), а затем вставлять эту таблицу данных в базу данных с SqlBulkCopy
класса SqlBulkCopy
. Промыть и повторить.
PS: Звучит как «забавная» проблема. Есть ли у вас какие-то образцы данных, которые где-то сидят, чтобы проверить это? 5 часов звучат как ДЛИТЕЛЬНОЕ время для чего-то, что сначала кажется тривиальным, затем снова 20 миллионов раз практически ничего не складывается. В частности, мне интересно, как «большие» данные относятся к стороне RTF: значения ca 2k в среднем или, точнее, 200 тысяч? И какое оборудование вы используете?
Самый быстрый вариант - перезаписать логику приложения C # в хранимую процедуру CLR, чтобы вся обработка выполнялась на сервере.