Как наиболее эффективно вставить / обновить несколько миллионов строк в SQL Server?

1

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

Количество операторов update/insert находится где-то в миллионах. Каков наиболее эффективный способ запускать много операторов SQL в.net С#?

// Insert/Update while reading text file
While (reader.read)
{
   sql.ExecuteNonQuery();
}

Или...

// build a list to loop through later and insert/update
While (reader.read)
{
   List.Add(sql);
}

foreach(string s in sql)
{
   sql.ExecuteNonQuery();
}

Или...

// Build a list and run 1000 statements at one time
While (reader.read)
{
   List.Add(sql);
   if(List.Count == 1000)
   {
      sql.ExecuteNonQuery();
   }
}
  • 0
    Если массовые вставки не подходят, вы можете создавать временные таблицы и выполнять всю массовую вставку через XML, это довольно просто, быстро и эффективно.
Теги:
bigdata
insert

1 ответ

5

Используйте класс SqlBulkCopy.

Позволяет эффективно загружать SQL Server таблицу с данными из другого источника.

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

Существуют и другие способы загрузки данных в таблицу SQL Server (например, инструкции INSERT), но SqlBulkCopy обладает значительным преимуществом по производительности. Класс SqlBulkCopy может использоваться для записи данных только в таблицы SQL Server. Однако источник данных не ограничивается SQL Server; любой источник данных может использоваться, если данные могут быть загружены в экземпляр DataTable или прочитаны с помощью экземпляра IDataReader.

  • 0
    Это только для вставок или обновлений?
  • 0
    @shaolinmonk, вы не можете использовать его для обновлений, насколько я знаю, вы должны вставить данные в таблицу Temp, а затем обновить. См .: stackoverflow.com/questions/4889123/… и stackoverflow.com/questions/12521692/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню