Обработайте каждую строку и скопируйте ее в новую таблицу, используя C # - PullRequest
3 голосов
/ 03 апреля 2012

У меня есть таблица MSSQL 2008 с несколькими миллионами записей.Мне нужно перебрать каждую строку, изменить некоторые данные и скопировать обновленную запись в новую таблицу с помощью приложения на C #, которое выполняется ежедневно.

Я пытался сделать это, используя объекты ADO.NET, но с этим методом связаны проблемы с памятью, не говоря уже о том, что он очень медленный.Я прочитал о библиотеках массового копирования и способах копирования одной таблицы в другую только для SQL, но ни один из них не предусматривает изменение записей перед их копированием.Мне нужно найти лучший способ для выполнения этой операции.

Ответы [ 4 ]

3 голосов
/ 03 апреля 2012

Когда вы упоминаете проблемы с памятью, я предполагаю, что вы пытаетесь загрузить миллион строк в память, обработать их и затем записать обратно в базу данных.Вы можете избежать этого путем «потоковой передачи» данных вместо полной загрузки.SqlDataReader будет обрабатывать буферизацию для вас, поэтому на стороне чтения вы можете сделать простой цикл WHILE, который выбирает строки одну за другой.Фактическое преобразование, которое у вас уже работает, кажется, поэтому все, что вам нужно сделать, это позаботиться о записи результатов обратно в базу данных.ИМХО, самый быстрый способ сделать это - сохранить буфер данных с несколькими результатами (начните с 100, поработать и посмотреть, где находится наилучшее место) в таблице данных, а затем поместить эту таблицу данных в базу данных, используя SqlBulkCopyучебный класс.Промыть и повторить.

PS: звучит как "забавная" проблема.Есть ли у вас образцы данных, чтобы где-нибудь это проверить?5 часов звучат как ДОЛГОЕ время для чего-то, что сначала кажется тривиальным, а затем 20 миллионов раз, практически ничего не складывается.В частности, мне интересно, насколько «большими» являются данные на стороне RTF: средние значения составляют около 2 тыс., А точнее 200 тыс.?И на каком оборудовании вы работаете?

3 голосов
/ 03 апреля 2012

Самый быстрый вариант - переписать логику приложения C # в хранимую процедуру CLR , чтобы вся обработка происходила на сервере.

1 голос
/ 03 апреля 2012

Использование SSIS . Запланируйте ежедневную работу, которая выполняет преобразование и запускает пакет служб SSIS. Это позаботится о пакетной обработке и потреблении памяти, и предложит несколько быстрых разъемов для чтения и записи данных . Вы можете встроить свой собственный код C # (разметка RTF в чистый текст) как компонент служб SSIS, см. Разработка пользовательских объектов для служб Integration Services .

1 голос
/ 03 апреля 2012

Проверка в Интернете выглядит следующим образом: Официальный ответ Microsoft на преобразование форматированного текста в простой текст состоит в том, чтобы загрузить данные в элемент управления RichTextBox и затем извлечь их с помощью свойства RichTextBox.Text. Это отстой по многим причинам, но в основном потому, что это означает, что вам придется испачкать руки. Лучше всего написать небольшое приложение, которое вызывает элемент управления RichTextBox и передает все ваши данные в / из базы данных (использование SqlDataReader должно облегчить проблемы с памятью, о которых вы упоминали).

Точно так же, как процесс - я бы предложил создать промежуточную таблицу, в которую будут сбрасываться ваши «очищенные» строки данных перед добавлением их в рабочую таблицу. Как только вы правильно вычислили сохраненный процесс, вы можете создать триггер, который автоматически вызывает ваш сохраненный процесс каждый раз, когда запись добавляется в вашу грязную таблицу. Это в конечном итоге исключит необходимость ежедневного запуска вашей программы для перемещения записей, поскольку триггер будет следить за тем, чтобы это происходило «на лету».

Правка - последняя мысль

Мне пришло в голову, что вам может быть неудобно писать хранимые процедуры и триггеры, что нормально. Более «программным» решением было бы выкинуть все файлы из вашей грязной таблицы в текстовый файл с разделителями, который можно легко загрузить и проанализировать. Получив текстовый файл, вы можете манипулировать им с помощью своего приложения (прочитать его, очистить, создать очищенный файл ... что у вас есть), а затем загрузить его для чтения обратно в базу данных. В зависимости от вашего комфорта / фона / уровня навыков, это может быть лучшим решением для выполнения работы.

Надеюсь, это поможет!

...