Scheinbar einfache Abfrage sehr langsam auf Entity Framework
Also ich habe ein sehr einfaches Daten-Modell in meinem Projekt (targeting .NET 4.0, EF 5 NuGet installiert, die Datenbank zuerst), mit 2 Tabellen Artikel und Artikelgruppe.
Element-Tabelle hat verschiedene Felder, die beide string-und numerischen, und ein Fremdschlüssel verweist auf eine ItemGroup.
ItemGroup auf der anderen Seite hat nur Id, Name und Code (von denen die letzten 2 Saiten).
Nun, ich habe etwa 50k Items und nur 100 ItemGroups. Wenn ich ausführen ein context.Items.ToList()
unter Verwendung von SQL Profiler, die Dauer ist etwa 2-3 Sekunden, das ist völlig in Ordnung. Wenn ich allerdings wollen, laden Sie die ItemGroups gleichzeitig mit context.Items.Include("ItemGroup").ToList()
, der Zeitpunkt der Ausführung der Sprünge bis zu etwa 12 Sekunden. Auch, wenn ich einfach nur Holen die ItemGroups nachdem ich holte alle Gegenstände, die Ausführungszeit ist sehr lange, wie gut. Dies führt mich zu glauben, dass es die Zuordnung der Items zu Ihren jeweiligen Gruppen, die sich die Zeit nimmt.
Aber das erklärt immer noch nicht, warum SQL Profiler-Berichte die sehr einfache INNER-JOIN -Abfrage Einnahme von weit über 10 Sekunden als gut, im Vergleich zu der sehr gleiche Abfrage ohne JOIN unter einem mickrigen 2-3 Sekunden.
Ich bin ratlos hier, nie konfrontiert diese Art von problem vor, so dass jede Beratung ist mehr als willkommen.
- 2-3 Sekunden für 100 Zeilen? Das scheint schlecht zu mir für ein start, was für eine Art von hardware laufen Sie auf?
- Wenn ich die erste Abfrage nur die Gruppen, die Zeit, die Tropfen zu Millisekunden. Ich denke, es ist die Abbildung der Entitäten oder so etwas in der Art, dass der sich Zeit nimmt.
- Sind Sie sicher, dass der inner-join durchgeführt wird, die auf index ' ed Feldern? Versuchen Sie es mit der Ausgabe von SQL profiler in der Datenbank tuning Assistent.
- Ich habe in der Ausführung plan auf dem management studio, und er schlug vor, einen index hinzufügen, was ich auch Tat. Aber es schien nicht zu haben, keine Wirkung. Wo finde ich diese Datenbank tuning Assistent?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Zeit, wenn Sie mit eager-loading(enthalten) lädt die ganze db-Struktur auf einmal aus der Datenbank.Es ist also sehr langsam.
Aber Sie identifizieren die Bereiche, die Sie brauchen, um zu verbessern, indem konvertieren Sie Ihre EF-Abfragen in T-SQL mithilfe LinqPad und dann mit Database Engine Tuning Adviser auf Sql Server 2008 wird Ihnen helfen, identifizierte die index-Schlüssel, was man benötigt.
Habe ich geschrieben blog-post über , wie zu konvertieren, EF-T-Sql - Hier
Dieser Artikel erklärt, mehr als 10 Methoden zur Verbesserung der Leistung Ihres EF-Abfrage Hier