2008-09-26 6 views
4

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

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

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

ответ

16

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

Кроме того, стоит проверить Flat File Bulk Import methods speed comparison in SQL Server 2005.

Update: Если вы новичок в SSIS, проверить некоторые из этих сайтов, чтобы вы на кратчайшем пути. 1) SSIS Control Flow Basics 2) Getting Started with SQL Server Integration Services

Это еще один способ: по телефону importing Excel file into SQL 2005.

+0

В SSIS все проще и быстрее. – EvilSyn 2008-09-26 20:00:54

+0

Я нахожу SSIS огромной болью в keester. Он чаще всего держится за нечетные реаны и требует доступа DBA к серверу базы данных для устранения неполадок/исправления/повторного запуска (что ограничено в нашей производственной среде). – 2008-09-26 20:04:03

1

Это будет потоковое усилие.

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

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

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

1

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

0

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

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

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

1

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

0

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

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

0

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

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

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

1

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

1

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

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

What's the fastest way to bulk insert a lot of data in SQL Server (C# client)

What are the recommended learning material for SSIS?

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

 Смежные вопросы

  • Нет связанных вопросов^_^