LINQ InsertOnsubmit sehr langsam im Vergleich zur Legacy SQL Insert Anweisung
-
25-10-2019 - |
Frage
Ich habe einen großen Einfügungsjob, beispielsweise 300000 Einsätze.
Wenn ich es auf ältere Weise mache, schreibe ich einfach eine SQL -Zeichenfolge mit Blöcken von 100 Einfügenanweisungen und führe ein ExecuteCommand gegen die DB (jeweils 100 Datensätze) aus.
Das verleiht etwa 100 Einsätze pro 3 Sekunden oder so.
Jetzt gibt es natürlich Probleme mit einzelnen Zitaten und CRLFs innerhalb der eingefügten Werte. Anstatt Code zu schreiben, um die einzelnen Zitate und so weiter zu verdoppeln, da ich faul bin, habe ich mich mit Linq InsertOnsubmit und einem Kontext ein.
Und das dauert noch etwa 20 -fach als der Legacy Way !!!
Wieso den?
Lösung
Sie verwenden nicht das richtige Tool für den Job. LINQ-to-SQL und die meisten anderen ORMs (zumindest Entity Framework und NHibernate) sind für OLTP-Szenarien gedacht. Sie sind nicht für Bulk-Datenoperationen bestimmt und werden bei Verwendung für Bulk-Datenoperationen langsam ausgeführt.
Sie sollten verwenden SqlBulkCopy
.
Andere Tipps
Ich hatte die gleichen Probleme mit InsertOnSubmit()
lange dauern.
Verwenden Sie jedoch die DataTableHelper
Klasse (aus dem Link unten heruntergeladen) und nur 1 oder 2 Zeilen Ihres Codes ändern, können Sie stattdessen problemlos einen Masseneinsatz verwenden.
Zum Beispiel:
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);
}
Hoffe das hilft.