Einfügen einer großen Anzahl von Zeilen in SQL CE 4.0 mit Entity Framework 4 (Leistungsproblem)

8

Ich habe eine kleine SQL CE 4.0 Datenbank mit mehreren Tabellen, die mit Entity Framework 4 gemappt sind.

Hier ist der Code, den ich habe

%Vor%

Dieser Code passiert 24 times und jedes Mal, wenn die newItemDesignations -Liste exactly 525 elements enthält. Das sind insgesamt 12600 Zeilen zum Hinzufügen.

Der vollständige Prozess dauert 509 seconds . Ich denke, das ist zu viel für 12600 rows.

Ich bin mir bewusst, dass ich SaveChanges 24 times anrufe. Im Moment erlaubt mir das Anwendungsdesign nicht, alle Beilagen in eine einzige Transaktion zu stellen (mit SaveChanges ). Sehen Sie sich jedoch an, was mit der einzelnen Transaktion passiert. 509 / 24 = 21 seconds oder eine 40 ms per row .

  • Ist 40 ms die normale (durchschnittliche) Zeit für eine Zeile, die über EF4 eingefügt wird?

Ich habe meinen anderen Code überprüft (außer das Hinzufügen zur Datenbank und das Speichern von Änderungen). Es dauert insgesamt 100 ms für alle 12600 Zeilen. Das sind 0,01% der gesamten Zeit, das ist natürlich nicht das Problem. Die 99,99% der Verarbeitungszeit werden in EF4 AddObject und SaveChanges verbracht.

Ich bin mir auch bewusst, dass ich die ItemID Eigenschaft, die ein Fremdschlüssel ist, setze. Dies ist eine ganze Zahl, also denke ich, es sollte nicht viel ausmachen. Aber ich würde es nicht wissen.

Beachten Sie auch: Es gibt keine Indizes für eine der Tabellen (außer für primäre / Fremdschlüssel)

  • Was mache ich hier falsch, warum ist das so langsam?
  • Ist das die normale Zeit, die benötigt wird, um so viele Zeilen einzufügen, oder ist das eine Art von Leistungseinschränkungen in Bezug auf SQL CE 4?
Kornelije Petak 11.08.2011, 14:31
quelle

3 Antworten

6

Sie könnten in Erwägung ziehen, meine SqlCeBulkCopy-Bibliothek zu verwenden, um EF Ссылка

zu umgehen     
ErikEJ 11.08.2011, 14:52
quelle
10

Da die Beispiele knapp sind, hier ist der Code, den ich getestet habe und es funktionierte einwandfrei. Danke an ErikEJ's SqlCeBulkCopy library. Ein Muss.

%Vor%

Das Einfügen meiner (OP) 12600 Zeilen dauerte weniger als 2 Sekunden.

Dieses Beispiel ist schlecht, es ist nicht stark typisiert, aber es beschreibt, wie man eine Datentabelle manuell erstellt und sie mit SqlCeBulkCopy library in eine Datenbank einfügt (siehe akzeptierte Antwort für einen Link) .

    
Kornelije Petak 12.08.2011 05:39
quelle
1

Um die Antwort von ErikEJ und Ihr eigenes Beispiel weiter zu verbessern, können Sie die Implementierung von IDataReader über Listen verwenden, um die Daten in WriteToServer zu streamen, statt die Werte über ein DataTable zu duplizieren. Siehe diese Frage:

Erhalte einen IDataReader aus einer typisierten Liste

Ich habe dies bei der Arbeit einmal implementiert, es scheint die Performance nicht zu verbessern, aber es scheint den Speicherverbrauch zu reduzieren.

    
Adam Houldsworth 12.08.2011 09:56
quelle