ВСТАВКА данных из текстового файла в SQL-сервер (скорость? Метод?) - PullRequest
1 голос
/ 06 марта 2012

Получил 400-мегабайтный текстовый файл, разделенный символом «|».Используя форму Windows с C #, я вставляю каждую строку файла .txt в таблицу в моей базе данных SQL-сервера.

Я просто делаю это (сокращено на «...» длякраткость):

while ((line = file.ReadLine()) != null)
{
   string[] split = line.Split(new Char[] { '|' });

   SqlCommand cmd = new SqlCommand("INSERT INTO NEW_AnnualData VALUES (@YR1984, @YR1985, ..., @YR2012)", myconn);
   cmd.Parameters.AddWithValue("@YR1984", split[0]);
   cmd.Parameters.AddWithValue("@YR1985", split[1]);
   ...
   cmd.Parameters.AddWithValue("@YR2012", split[28]);

   cmd.ExecuteNonQuery();
}

Теперь это работает, но это занимает некоторое время.Я впервые делаю что-либо с огромным количеством данных, поэтому мне нужно убедиться, что А) Я делаю это эффективно, и что Б) мои ожидания не слишком высоки.

Используя SELECT COUNT(), пока идет цикл, я могу наблюдать, как число увеличивается и увеличивается со временем.Поэтому я использовал часы и некоторую базовую математику, чтобы выяснить скорость, с которой все работает. За 60 секунд было 73881 вставок.Это 1231 вставка в секунду.Вопрос в том, средняя скорость или плохая производительность?Если последнее, что я могу сделать, чтобы улучшить производительность?

Я прочитал кое-что о том, насколько эффективен SSIS для этой цели.Однако мне нужно, чтобы это действие выполнялось нажатием кнопки в форме Windows, а не через SISS.

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Оооо - этот подход даст вам ужасную производительность.Попробуйте использовать BULK INSERT следующим образом:

BULK INSERT MyTable
    FROM 'e:\orders\lineitem.tbl'
    WITH 
    (
        FIELDTERMINATOR ='|',
        ROWTERMINATOR ='\n'
    )

Это лучшее решение с точки зрения производительности.Недостатком является то, что файл должен присутствовать на сервере базы данных.Есть два обходных пути, которые я использовал в прошлом, если у вас нет доступа к файловой системе сервера, откуда вы запускаете процесс.Один из них - установить экземпляр SQL Express на рабочую станцию, добавить главный сервер в качестве связанного сервера к экземпляру рабочей станции, а затем запустить «BULK INSERT MyServer.MyDatabase.dbo.MyTable ...».Другой вариант - переформатировать файл CSV в XML, который можно очень быстро обработать, а затем передать XML для запроса и обработки с использованием OPENXML.И BULK INSERT, и OPENXML хорошо документированы в MSDN, и вам будет полезно прочитать примеры.

2 голосов
/ 06 марта 2012

Я бы согласился с Андомаром. Мне очень нравится SqlBulkCopy. Это действительно быстро (вам нужно поэкспериментировать с BatchSizes , чтобы убедиться, что вы найдете тот, который соответствует вашей ситуации.)

Для действительно углубленной статьи, обсуждающей различные варианты, ознакомьтесь с «Руководством по производительности загрузки данных» от Microsoft; http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx

Кроме того, посмотрите на пример C # с SqlBulkCopy из CSV Reader . Это не бесплатно, но если вы можете написать быстрый и точный парсер за меньшее время, то сделайте это. По крайней мере, это даст вам некоторые идеи.

2 голосов
/ 06 марта 2012

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

1 голос
/ 06 марта 2012

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

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

См. Эту статью: http://blogs.msdn.com/b/michen/archive/2007/03/22/running-ssis-package-programmatically.aspx для получения информации о программном запуске пакета служб SSIS. Он включает в себя параметры запуска с клиента, с сервера или из любого места.

Кроме того, ознакомьтесь с этой статьей, чтобы узнать о дополнительных способах повышения производительности групповой вставки в целом. http://msdn.microsoft.com/en-us/library/ms190421.aspx

...