2012-04-06 9 views
3

Ich habe ein C#/ASP.NET MVC/Entity Framework-Projekt mit etwas Langsamkeit geerbt. Es gibt nicht viele Daten in der DB, aber Anrufe an .Include() verursachten Verlangsamungen.Entitätsframework + LINQ Langsamkeit vs String-Abfragegeschwindigkeit?

Allerdings fand ich etwas sehr seltsam. Ich habe eine 2k Zeilen Tabelle mit nur Zahlen (5 Spalten). Ich habe Indizes für die Spalten, die ich suche.

Wenn tun:

_entities.MyTable.Where(x=> x.Id1 == 4 && x.Id2 == 5).First() 

es 1800ms auf meine Entwicklung Maschine nimmt.

Allerdings, wenn ich tun:

_entities.MyTable.Where("it.Id1 = 4 and it.Id2 = 5").First() 

es dauert wie 10ms.

Was ist das Problem? Ich verstehe nicht, warum der LINQ-Ausdruck so langsam wäre.

+1

Versuchen Sie, un es in LinqPad und vergleichen ihre generierten SQL-Abfrage mit Ihrem eigenen – Tigran

+0

Ist MyTable in jedem Unternehmen geerbt? – daryal

+0

@daryal sorry Ich bin immer noch ein bisschen wie ein Noob, wenn es um EF geht, wie würde das aussehen? Dieses Objekt/Modell ist mit anderen Objekten verknüpft. Die Zahlen in der Tabelle sind Fremdschlüssel für andere Tabellen. –

Antwort

0

Open SQL Profiler, rufen Sie die Anfragen von EF. Versuche es zu analysieren, Pläne zu erstellen. Scheint, dass EF Abfragen auf eine seltsame Weise implementiert, ohne Indizes zu erhalten.

+0

Ich habe keinen Profiler auf meiner Dev Box, da ich SQL Express verwende. Irgendwelche anderen Möglichkeiten, es zu tun? Ich habe SQL Server Management Studio zum Ausführen/Debuggen von Abfragen. –

+0

Nicht sicher, ob es hier erlaubt ist, einen Link auf andere Ressourcen zu veröffentlichen, aber google "sql server get all queries". Es gibt viele Möglichkeiten, um runned Anfragen zu erhalten, ohne Profiler –

+0

ich LinqPad bin mit basierend auf einem Vorschlag oben und es ist nur so schnell wie die String-Methode, aber die Reihenfolge der Parameter komisch ist ... Es tut „, wo (4 = Id1) und (5 = Id2) "anstelle von Id1 = 4 und Id2 = 5. In LinqPad scheint es jedoch nicht so gut zu sein. –

0

Könnte es sein, dass EF das SQL generiert, um die where-Klausel im ersten Beispiel auszuführen, und in der zweiten ist SQL viel einfacher zu generieren, da es einfach das bereits bereitgestellte SQL einbinden kann?

Ive festgestellt, dass EF zu generieren Abfragen sehr langsam ist, so scheint es in diesem Fall als eine ziemlich einfache Abfrage in beiden Fällen unwahrscheinlich.

Haben Sie versucht, die erste Abfrage zu kompilieren und sie mehrmals auszuführen, um zu überprüfen, dass die Ausführungszeit nur das Ausführen der SQL enthält und nicht nur das Erzeugen der SQL?