Die executeTime unten ist 30 Sekunden das erste Mal und 25 Sekunden das nächste Mal, wenn ich den gleichen Code ausführen. Wenn ich in SQL Profiler schaue, sehe ich sofort eine Anmeldung, dann sitzt sie für ungefähr 30 Sekunden dort. Sobald die select-Anweisung ausgeführt wird, beendet die App den ToList-Befehl. Wenn ich die generierte Abfrage von Management Studio aus führe, dauert die Datenbankabfrage nur etwa 400 ms. Es gibt 14 Zeilen und 350 Spalten zurück. Es sieht so aus, als ob die Umwandlung der Datenbankergebnisse in die Entitäten so kurz ist, dass sie nicht bemerkbar ist.Warum benötigt Entity Framework 30 Sekunden zum Laden von Datensätzen, wenn die generierte Abfrage nur eine halbe Sekunde dauert?
Was passiert also in den 30 Sekunden vor dem Datenbankanruf?
Wenn das Entity-Framework so langsam ist, können wir es nicht verwenden. Gibt es etwas, das ich falsch mache oder etwas, das ich ändern kann, um das dramatisch zu beschleunigen?
UPDATE: In Ordnung, wenn ich eine kompilierte Abfrage verwenden, ist es das erste Mal 30 Sekunden dauern, und das zweite Mal, dauert es 1/4-Sekunden. Kann ich etwas tun, um den ersten Anruf zu beschleunigen?
using (EntitiesContext context = new EntitiesContext())
{
Stopwatch sw = new Stopwatch();
sw.Start();
var groupQuery = (from g in context.Groups.Include("DealContract")
.Include("DealContract.Contracts")
.Include("DealContract.Contracts.AdvertiserAccountType1")
.Include("DealContract.Contracts.ContractItemDetails")
.Include("DealContract.Contracts.Brands")
.Include("DealContract.Contracts.Agencies")
.Include("DealContract.Contracts.AdvertiserAccountType2")
.Include("DealContract.Contracts.ContractProductLinks.Products")
.Include("DealContract.Contracts.ContractPersonnelLinks")
.Include("DealContract.Contracts.ContractSpotOrderTypes")
.Include("DealContract.Contracts.Advertisers")
where g.GroupKey == 6
select g).OfType<Deal>();
sw.Stop();
var queryTime = sw.Elapsed;
sw.Reset();
sw.Start();
var groups = groupQuery.ToList();
sw.Stop();
var executeTime = sw.Elapsed;
}
Dies scheint so kontra intuitiv. Das Erstellen mehrerer SQL-Anfragen und das Laden der gleichen Anzahl von Objekten ist schneller als das Erstellen einer SQL-Anfrage? – toxaq
Chris Sie scheinen eine Menge über die .include wissen, können Sie bitte einen Blick auf meine Post http://stackoverflow.com/questions/10320174/speed-up-return-of-linq-entity-result –
@bugz - Ich habe nachgesehen. Es tut mir leid, Mann, ich habe keine Ahnung. Ich sollte zur Kenntnis nehmen, dass ich am Ende mit ASP.net und dem Entity Framework extrem unzufrieden war. Alles, was ich gemacht habe, hat viel zu lange gedauert. Ich schreibe gerade diese ganze Anwendung in Google App Engine um. –