2010-06-25 4 views
5

Ich habe gerade angefangen LINQ auf einer täglichen Basis zu verwenden. Ich hätte eine ganze Menge über L2E Abfragen lesen Sie die folgenden kompiliert werden zur Verbesserung der Leistung mit:Sind LINQ zu Entitäten 4.0-Abfragen standardmäßig kompiliert?

CompiledQuery.Compile(query); 

Mit LINQ-To-Entities 4.0 ich eine Abfrage 10 mal unkompilierten lief und dann kompiliert und ergab folgende Ergebnisse in Sekunden:

// Sample Query 
from u in ctx.Users orderby u.Id, u.Username select u 

Uncompiled Compiled 
--------------------- 
0.295  0.2946174 
0.024  0.0220462 
0.008  0.0060126 
0.013  0.0210441 
0.007  0.010021 
0.011  0.010021 
0.008  0.0060126 
0.009  0.0070147 
0.008  0.0060126 

Wie Sie sehen können, gibt es keinen wirklich großen Unterschied in den Zeiten von meinem kleinen Test. Es gibt eine langsamere Zeit für den ersten Anruf, und dann beschleunigen beide (was Kompilierung/Caching impliziert). Kann mir jemand Einblick geben?

+0

Haben Sie dies vor einer Weile recherchiert und, afak (was definitiv nicht definitiv ist) war die Antwort nein. Wenn ich in der Lage wäre, eine definitive Antwort zu finden, würde ich es hier geben, aber gehe nicht davon aus, wenn niemand es tut. – Will

+0

Was passiert also zum ersten Mal, wenn eine Anfrage ausgewertet wird? – TheCloudlessSky

Antwort

1

Von dem, was ich sammeln kann, hat es etwa den gleichen Vorteil von hartcodierten SQL-Abfragen mit eingebetteten Parametern für SQL-Abfragen mit benannten Parametern: Das System kann erkennen, dass sie alle gleich sind und den gleichen Abfrageplan verwenden.

Zum Beispiel, wenn Sie einfach den Ausdruck oben inline, würde es wahrscheinlich funktioniert genauso gut wie kompilieren, wenn Sie immer in der gleichen ctx.Users Objekt übergeben. Wenn Sie jedoch mehrere Benutzer-Repositories desselben Typs hatten und diese auf allen order by verwenden wollten, wäre es eine gute Idee, die Abfrage einmal zu kompilieren und Parameter zu verwenden, um darauf zuzugreifen.

Bei der Untersuchung dieser Frage habe ich untersucht, wie eine LINQ-Abfrage in IL gebildet wird: Ein neuer Func<> Delegat wird jedes Mal für jede Klausel in Ihrer LINQ-Abfrage erstellt, wenn Sie sie aufrufen. Schon aus diesem Grund stelle ich mir vor, dass das Kompilieren einer Abfrage für Ihr System besser ist, wenn es um Speicher-Thrashing geht.

+0

Ja, ich habe festgestellt, dass der SQL-Server offensichtlich eine Zwischenspeicherung der Abfrage durchführt, da die nicht kompilierte Version das gleiche Leistungsproblem hat, wenn sie zum ersten Mal ausgeführt wird. Nach einigen Tests heute auf meinem Heimcomputer konnte ich feststellen, dass im Durchschnitt kompilierte Abfragen in meiner Umgebung 0,001 Sekunden schneller sind. Es ist nicht viel, aber trotzdem interessant. – TheCloudlessSky

0

Sie sind wahrscheinlich nicht den Kontext zu entsorgen. Abfragen werden im Kontext zwischengespeichert. Wenn Sie sie jedoch kompilieren, können Sie sie in mehreren Kontexten verwenden. Schwer zu sagen, da Sie nicht Ihren vollständigen Code zeigen.

+0

Nein, es wurde in eine 'using'-Anweisung innerhalb einer Methode eingepackt, die aufgerufen wurde, als auf eine Schaltfläche geklickt wurde (ich habe den Code nicht bei mir, aber ich weiß, dass ich ihn entsorgte). – TheCloudlessSky

+0

Sie werden dann Code schreiben müssen, wenn Sie eine Antwort wollen. –

Verwandte Themen