В чем заключаются подводные камни при вставке миллионов записей в SQL Server из плоского файла?

Я собираюсь начать путешествие с написания приложения для форм Windows, которое будет открывать текстовый файл с разделителями по вертикальной линии и размером около 230 МБ. Затем это приложение вставит эти данные в базу данных sql server 2005 (очевидно, это должно произойти быстро). Для этого проекта я использую C # 3.0 и .net 3.5.

Я не прошу приложение, просто некоторые общие советы и советы о возможных подводных камнях. На сайте я понял, что массовое копирование SQL является обязательным условием, есть ли что-нибудь, о чем я должен подумать (я думаю, что простое открытие txt-файла с помощью приложения форм будет большим усилием; может быть, разбить его на данные blob?).

Спасибо, подредактирую вопрос для наглядности, если кому-то понадобится.


person RyanKeeter    schedule 26.09.2008    source источник


Ответы (9)


Вам нужно написать приложение winforms? Использование SSIS могло бы быть намного проще и быстрее. Доступно несколько встроенных задач, в частности массовая вставка задачи.

Также стоит проверить Сравнение скорости методов массового импорта плоских файлов в SQL Server 2005.

Обновление: если вы новичок в SSIS, посетите некоторые из этих сайтов, чтобы ускорить процесс. 1) Основы потока управления SSIS 2) Начало работы со службами интеграции SQL Server

Это еще одно Практическое руководство: на импорт файла Excel в SQL 2005.

person Gulzar Nazim    schedule 26.09.2008
comment
В SSIS намного проще и быстрее ... согласился. - person EvilSyn; 27.09.2008
comment
Я считаю, что SSIS - огромная боль для хранителя. Он чаще выдает из строя по нечетным причинам и требует доступа администратора баз данных к серверу базы данных для устранения неполадок / исправления / повторного запуска (что ограничено в нашей производственной среде). - person Ron Savage; 27.09.2008
comment
Я согласен, что это требует некоторого мастерства, особенно в устранении неполадок и развертывании. - person Gulzar Nazim; 27.09.2008
comment
Мне очень нравится эта идея, Гульзар, есть ли у вас какие-нибудь дополнительные суперссылки, которые помогут в этом проекте? Те двое, что вы предоставили, просто фантастические. - person RyanKeeter; 27.09.2008
comment
@Ron: Я согласен на 100%. Используя DTS и хорошо его зная, я не могу выдержать SSIS и отказался от него для большого проекта, такого как этот вопрос. Миллионы строк вставляются из плоских файлов, которые я не контролирую над созданием с аномалиями, которые я не могу исправить. SSIS просто не работает. - person Taptronic; 29.10.2008

Это будет стриминг.

Если можете, не используйте здесь транзакции. Стоимость транзакции будет слишком велика.

Итак, что вы собираетесь делать, это читать файл по строке за раз и вставлять его по строке за раз. Вы должны сбрасывать неудачные вставки в другой файл, который вы сможете позже диагностировать и увидеть, где они оказались неудачными.

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

person Orion Adrian    schedule 26.09.2008

Вы можете попробовать использовать SqlBulkCopy. Он позволяет получать данные из «любого источника данных».

person Ryan Lundy    schedule 26.09.2008

Кстати, иногда быстрее удалить индексы таблицы и воссоздать их после операции массовой вставки.

person vIceBerg    schedule 26.09.2008

Вы можете подумать о переходе с полного восстановления на режим неполного журнала. Это поможет сохранить разумный размер резервных копий.

person Dave DuPlantis    schedule 26.09.2008
comment
Я думал, что режим с неполным протоколированием уменьшает размер журнала, но увеличивает объем резервных копий. Разве msdn не говорит, что (msdn.microsoft.com/en-us/library /ms175987.aspx)? - person pkmiec; 27.09.2011
comment
Нет, это напоминает вам, что восстановление с неполным протоколированием на самом деле не сильно отличается от полного восстановления, за исключением некоторые операции; если вы не используете эти операции, вы в основном полностью восстанавливаетесь. В этом случае OP может выполнить BULK INSERT восстановление с неполным протоколированием, чтобы избежать регистрации этих вставок (зная, что вставка может быть повторена при необходимости). - person Dave DuPlantis; 28.09.2011

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

Вам нужно будет выделить время, чтобы разобраться в SSIS, но это должно окупиться. Здесь, на SO, есть еще несколько тем, которые, вероятно, будут полезны:

Какой самый быстрый способ массовой вставки большого количества данных в SQL Server (клиент C #)

Какие учебные материалы рекомендуются для SSIS?

Вы также можете создать пакет из C #. У меня есть программа на C #, которая считывает «главный файл» 3GL из устаревшей системы (анализирует объектную модель с помощью API, который у меня есть для связанного проекта), берет шаблон пакета и изменяет его для создания пакета для ETL.

person Cade Roux    schedule 26.09.2008

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

Просто предложение, которое может сэкономить вам серьезное время на программирование, если вам не нужно, чтобы оно было настолько быстрым, насколько это возможно. В зависимости от того, как часто этот импорт должен выполняться, экономия нескольких дней на программирование может легко окупиться в обмен на ожидание нескольких часов, пока он выполняется.

person user12861    schedule 26.09.2008

Вы можете использовать SSIS для чтения и вставки, но называть его как пакет из вашего приложения WinForms. Затем вы можете передать такие вещи, как источник, место назначения, строки подключения и т. Д. В качестве параметра / конфигурации.

HowTo: http://msdn.microsoft.com/en-us/library/aa337077.aspx

Вы можете настроить преобразования и обработку ошибок внутри SSIS и даже создать логическое ветвление на основе входных параметров.

person Meff    schedule 26.09.2008

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

Ваше приложение может запустить команду, если вам нужно сохранить для нее параметры командной строки (сервер, база данных, имя пользователя / пароль или доверенное соединение, таблица, файл ошибок и т. Д.).

Мне этот метод нравится больше, чем выполнение SQL-команды BULK INSERT, потому что файл данных не обязательно должен находиться в системе, доступной для сервера базы данных. Чтобы использовать массовую вставку, вы должны указать путь к файлу данных для загрузки, поэтому он должен быть видимым и читаемым пользователем системы на сервере базы данных, на котором выполняется загрузка. Обычно для меня слишком много хлопот. :-)

person Ron Savage    schedule 26.09.2008