Каковы подводные камни вставки миллионов записей в SQL Server из плоского файла? - PullRequest
4 голосов
/ 26 сентября 2008

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

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

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

Ответы [ 9 ]

16 голосов
/ 26 сентября 2008

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

Кроме того, стоит проверить Сравнение скорости импорта простых файлов в SQL Server 2005.

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

Это еще один Как: импортировать файл Excel в SQL 2005 .

1 голос
/ 27 сентября 2008

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

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

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

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

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

1 голос
/ 27 сентября 2008

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

1 голос
/ 27 сентября 2008

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

1 голос
/ 27 сентября 2008

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

1 голос
/ 26 сентября 2008

Это будет потоковое начинание.

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

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

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

0 голосов
/ 27 сентября 2008

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

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

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

0 голосов
/ 27 сентября 2008

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

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

0 голосов
/ 27 сентября 2008

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

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

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

...