C # массивный запрос на обновление SQL - PullRequest
3 голосов
/ 12 октября 2010

Здесь есть сценарий:

У меня есть текстовый файл с 1,8 миллионами строк, который мне нужно вставить в таблицу SQL, код, который у меня работает, работает нормально, довольно медленно (например, 250 тысяч строк в день).К сожалению, у меня есть около 4 текстовых файлов такого размера, поэтому мне нужен способ ускорить процесс.Любая помощь будет оценена.если какой-то код не выглядит правильно, это потому, что я пропустил некоторые вещи для конфиденциальности.Я знаю, что могу вырубить файл file.appendall, но я использую его для отслеживания, и я также делаю звездочку ++, чтобы на следующий день я мог взять ее, чтобы не остановить резервное копирование.

DirectoryInfo dinfo = new DirectoryInfo(ocrdirectory);
FileInfo[] Files = dinfo.GetFiles("*.txt");
foreach (FileInfo filex in Files)
{
        string[] primaryfix = File.ReadAllLines(dinfo + "\\" + filex);
        string filename = filex.ToString();
        string[] spltifilename = filename.Split('.');
        foreach (string primary in primaryfix)
        {
            string sqltable = ("dbo.amu_Textloadingarea");
            string sql = "update " + sqltable + 
                         " set [Text] = [Text] + '" + primary +"|"+ 
                         "' where unique = '" + spltifilename[0] + "'";
            File.AppendAllText(@"C:\convert\sqltest.txt", sql+"\n");
            SqlConnection con = new SqlConnection("Data Source= Cote ;Initial Catalog= eCASE;Integrated Security= SSPI");
            con.Open();
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlDataReader reader = cmd.ExecuteReader();
            con.Close();
            Console.WriteLine(start);
            start++;
        }

Ответы [ 5 ]

10 голосов
/ 12 октября 2010

Вам нужно посмотреть в BULKCOPY . В частности, посмотрите на класс SqlBulkCopy.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

http://msdn.microsoft.com/en-us/library/7ek5da1a%28VS.80%29.aspx

Хорошая запись в блоге об использовании SqlBulkCopy для загрузки большого текстового файла (+ 1M строк) в БД

http://blog.stevienova.com/2008/01/16/net-fastest-way-to-load-text-file-to-sql-sqlbulkcopy/

7 голосов
/ 12 октября 2010

Я бы предложил вместо запланированного кода попробовать запланированное решение SSIS или решение bcp .

Кроме того, взглянув на свой код, вы структурировали его с наименьшей эффективностью.Хотя то, что у вас есть, будет хорошо работать для приложений, оно определенно не годится для массовых операций.Ваши проблемы:

  • Вы создаете объекты БД с каждой итерацией цикла, которую нужно создавать только один раз
  • Вы каждый раз подключаетесь к БД.Это также необходимо сделать один раз (за сеанс)
  • Вам нужно разбить этот метод ... но это все еще не лучшее решение

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

2 голосов
/ 12 октября 2010

Для начала, открывайте свое соединение только один раз (вне вашей петли). Кроме того, звоните cmd.ExecuteNonQuery() вместо того, чтобы создавать ридер, который вы просто выбросите. Вы также можете создать SqlCommand один раз (после открытия соединения) и просто переназначить оператор SQL свойству .CommandText. Если вы сделаете это, также сделайте это подготовленным оператором и просто присвойте свои значения параметрам.

2 голосов
/ 12 октября 2010

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

0 голосов
/ 12 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...