2011-01-27 5 views
1

У меня есть большое задание для вставки, скажем 300000 вложений.LINQ Insertonsubmit очень медленный по сравнению с устаревшим заявлением SQL Insert

Если я делаю это унаследованным способом, я просто пишу строку SQL с блоками из 100 операторов Insert и выполняю executeCommand против БД (каждые 100 записей).

Это составляет около 100 вставок за 3 секунды или около того.

Теперь, конечно, есть проблемы с одинарными кавычками и CrLf в пределах вставленных значений. Поэтому вместо того, чтобы писать код, чтобы удвоить одинарные кавычки и т. Д., Поскольку я ленив, у меня есть переход с Linq InsertOnSubmit и один контекст. SublitChanges 100 строк.

И это займет примерно 20 раз больше, чем унаследованный путь !!!

Почему?

+0

Вы используете SQL-трассировку для сравнения двух методов? Мне было бы любопытно увидеть что-то из реальных вставок. – schellack

+0

Linq-to-SQL не ** разработан и предназначен для массовых операций - используйте «классический» прямой способ SQL (например, «SqlBulkCopy» и т. Д.) Для этих ситуаций –

ответ

4

Вы не используете подходящий инструмент для работы. LINQ-to-SQL и большинство других ORM (по крайней мере, Entity Framework и NHibernate) предназначены для сценариев OLTP, они не предназначены для операций с объемными данными и будут медленно выполняться при использовании для операций с объемными данными.

Вы должны использовать SqlBulkCopy.

+0

+1 хорошо сказано .... –

1

У меня были такие же проблемы, с InsertOnSubmit() занимает много времени.

Однако, используя класс DataTableHelper (можно скачать по ссылке ниже) и сменив только 1 или 2 строки вашего кода, вы можете легко использовать Массовую вставку.

Bulk-inserts

Например:

const int RECORDS_TO_INSERT = 5000; 

List<Product> recordsToBeInserted = new List<Product>(); 
using (NorthwindDataContext dc = new NorthwindDataContext()) 
{ 
    for (int n = 0; n < RECORDS_TO_INSERT; n++) 
    { 
     Product newProduct = new Product() 
     { 
      ProductName = "Product " + n.ToString(), 
      UnitPrice = 3999, 
      UnitsInStock = 2, 
      UnitsOnOrder = 0, 
      Discontinued = false 
     }; 
     recordsToBeInserted.Add(newProduct); 
    } 
    // Insert this List<> of records into the [Products] table in our database, using a Bulk Insert 
    DataTableHelper.BulkCopyToDatabase(recordsToBeInserted, "Products", dc); 
} 

Надеется, что это помогает.