Sehr schlechte Leistung für die Stapeleinfügung mit SQL Server CE 4.0 und Entity Framework 4.2

8

Ich füge viele Daten in SQL Server CE 4.0 mit Entity Framework 4.2 (Code-zuerst) ein, und die Leistung ist im Vergleich zur direkten SQL-Einfügung miserabel.

Das Modell ist sehr einfach:

%Vor%

Ich habe 2623 DocMembers und insgesamt 7747 DocItems einzufügen, und ich bekomme die folgenden Ausführungszeiten:

%Vor%

Ich kann verstehen, dass mit EF etwas Overhead verbunden ist, aber es ist 65 mal langsamer als SQL!

Vielleicht gibt es ein Problem in meinem Code, aber es ist ziemlich einfach und ich kann nicht sehen, was falsch sein könnte:

%Vor%

Ich habe auch versucht, SaveChanges für jedes eingefügte Element oder alle 100 oder 200 Elemente aufzurufen, ohne Erfolg (es macht es sogar noch schlimmer).

Gibt es eine Möglichkeit, die Leistung zu verbessern, oder muss ich SQL für Stapeleinfügungen verwenden?

EDIT: Der Vollständigkeit halber ist hier der Code für die SQL-Einfügung: Ссылка

    
Thomas Levesque 23.01.2012, 23:35
quelle

2 Antworten

6

Sie können meine SqlCeBulkCopy-Bibliothek zum Laden von Massendaten verwenden, sie ahmt die SqlBulkCopy-API nach: Ссылка

    
ErikEJ 24.01.2012, 07:25
quelle
1

Es ist langsam, weil es den Einsatz nicht dosiert.

Wenn Sie mit identity in die Datenbank einfügen, muss die Ergebnis-ID nach jedem Element ausgewählt werden, das dem Modell zugewiesen werden soll. Das macht es wirklich langsam.

Ihr Adhoc-SQL wählt die ID nicht aus, so dass Sie bei der Stapelung alle Anweisungen gleichzeitig übermitteln können.

Alt geschrieben mit NHibernate:

Ссылка

Ich schrieb über ORM generierte IDs gegen SQL Generated IDs.

    
Phill 24.01.2012 00:09
quelle