| 

.NET C# Java Javascript Exception

1
Hallo

Zu Testzweichen, und um EF näher kennen zu lernen, habe ich mir ein kleines Tool gemacht das mir ein paar Tausend neue Objekte erstellt und in der DB persistiert. Eingesetzt wird EF in der Version 4.x.

Starten tut die Geschichte noch relatiev zügig. Etwa 60 neue Objekte in der Sekunde. Aber es wird sehr schnell viel langsamer.

Count: 100/1000 - Records/sec.: 58.412583145201 (ms: 1711.9599)
Count: 200/1000 - Records/sec.: 24.088080668477 (ms: 4151.4308)
Count: 300/1000 - Records/sec.: 15.1251957067979 (ms: 6611.4847)
Count: 400/1000 - Records/sec.: 10.9652446045624 (ms: 9119.7236)
Count: 500/1000 - Records/sec.: 8.39062367270822 (ms: 11918.0652)
Count: 600/1000 - Records/sec.: 6.67036827636883 (ms: 14991.676)
Count: 700/1000 - Records/sec.: 5.53074980469125 (ms: 18080.7311)
Count: 800/1000 - Records/sec.: 4.68821198556865 (ms: 21330.0935)
Count: 900/1000 - Records/sec.: 4.04659218727603 (ms: 24712.1517)
Recrods/sec.: 7.11162460454336

Und genau dieses Verhalten passt mir nicht. Die Objekte sind Self-Tracking Entity die schlussendlich über einen WCF Service an die Anwendung gehen. WCF ist aber bei diesen Tests nicht zwischen geschaltet.

Die Speicherlogik sieht aktuell so aus.
using (ProjectContainer db = new ProjectContainer(connectString))
{
db.Project.ApplyChanges(p);

db.SaveChanges();

p.AcceptChanges(); //Ob drin oder nicht ändert nichts an der Performance
}

Erstellt werden die Objekte in einer for Schlaufe.
Project p = new Project
{
Abteilung = abteilungen[RandNummer(abteilungen.Count)],
AnsprechpartnerID = Guid.Empty,
Beschreibung = string.Format("Projekt Nummer {0}", i),
Chance = chancen[RandNummer(chancen.Count)],
DlErtrag = RandNummer(1000000),
HwSwErtrag = RandNummer(1000000),
KundeID = Guid.Empty,
NaechsteAktion = new DateTime(2012, RandNummer(1, 12), RandNummer(1, 29)),
Name = string.Format("Projekt Nummer {0}", i),
Periode = perioden[RandNummer(perioden.Count)],
Phase = phasen[RandNummer(phasen.Count)],
Produkt = produkte[RandNummer(produkte.Count)],
Team = "Gibt es nicht"
};
m_ProjektService.SaveProjekt(p);


Das Objekt hat noch ein paar Referenzdaten die per Zufall geladen werden, aus Listen die VORHER von der DB geladen wurden, also nur einmal. Aber wie so wird das Teil nun immer langsamer?
News:
28.02.2012
GENiALi 2,5k 1 2 8
1 Antwort
1
Da du Self-Tracking Entities verwendest, vermute ich mal, dass die interne Verwaltung innerhalb des EF so aufwendig ist, dass es zu der schlechten Performance kommt. Möglicherweise liegt das Problem auch daran, dass alle Datensätze innerhalb einer Datenbank-Transaktion geschrieben werden. Ich kenne das EF leider nicht so gut um dir sagen zu können, wo du das Verhalten beeinflussen kannst.

Das Verhalten zeigt mir wieder mal, dass ORM's nicht für Batch- / bzw. Massendaten-Verarbeitung geeignet sind. Wenn ich große Datenmengen in einem Rutsch in die Datenbank schreiben muss, verwende ich in der Regel direkt ADO.NET, weil dies wesentlich performanter ist.
29.02.2012
luedi 2,2k 1 9
Für Teil Zwei gebe ich dir recht. Wird in der Software nicht vorkommen. Aber zu Testzwecken schon. Ist kein kritisches Problem. Allerdings würde mich interessieren wie so das so ist.
GENiALi 29.02.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH