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?

War es hilfreich?

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.

Bulk-Insert

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top