Каковы подводные камни вставки миллионов записей в SQL Server из плоского файла?

StackOverflow https://stackoverflow.com/questions/141556

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Это будет стриминговая программа.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как это сделать: http://msdn.microsoft.com/en-us/library/aa337077.aspx

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top