2010-06-10 21 views
5

auf diese Frage basiert: What is difference between Where and Join in linq?LINQ - Verwenden von wo oder beitreten - Leistungsunterschied?

Meine Frage folgendes:

Gibt es einen Unterschied in der Leistung in den beiden folgenden Aussagen:

from order in myDB.OrdersSet 
    from person in myDB.PersonSet 
    from product in myDB.ProductSet 
    where order.Persons_Id==person.Id && order.Products_Id==product.Id 
    select new { order.Id, person.Name, person.SurName, product.Model,UrunAdı=product.Name }; 

und

from order in myDB.OrdersSet 
    join person in myDB.PersonSet on order.Persons_Id equals person.Id 
    join product in myDB.ProductSet on order.Products_Id equals product.Id 
    select new { order.Id, person.Name, person.SurName, product.Model,UrunAdı=product.Name }; 

würde ich benutze immer den zweiten, nur weil es klarer ist.

Meine Frage ist jetzt, ist die erste langsamer als die zweite? Erzeugt es ein kartesisches Produkt und filtert es danach mit den Where-Klauseln?

Vielen Dank.

Antwort

3

Es hängt vollständig von dem Anbieter, den Sie verwenden.

Mit LINQ to Objects, wird es absolut das kartesische Produkt und Filter danach bauen.

Für Out-of-Process-Abfrageanbieter wie LINQ to SQL hängt es davon ab, ob es intelligent genug ist, um zu erkennen, dass es in einen SQL-Join übersetzt werden kann. Selbst wenn LINQ to SQL dies nicht tut, ist es wahrscheinlich, dass die Abfrage-Engine, die die Abfrage tatsächlich ausführt, dies tut - Sie müssten mit dem relevanten Abfrageplan-Tool für Ihre Datenbank überprüfen, um zu sehen, was tatsächlich passieren wird.


Side-Hinweis: mehrere „von“ Klauseln nicht immer in einem cartesianischen Produkt führen - der Inhalt eines „von“ auf dem aktuellen Element von früheren abhängen, z.B.

from file in files 
from line in ReadLines(file) 
... 
+1

Sehr gute Antwort, und mit der Verwendung von Joins sollte die Leistung besser sein? – kamahl

+0

@Patrick: Die Leistung hängt von der genauen Situation ab. Wenn LINQ to SQL es in dasselbe SQL konvertiert, wird das offensichtlich keinen Unterschied machen. Aber ja, im Allgemeinen sollte ein Beitritt besser sein. Ich bin sicher, es gibt Ausnahmefälle, wo es nicht wäre :) –

1

Meine Frage ist jetzt, ist die erste, langsamer als die zweite? Baut es ein kartesisches Produkt auf und filtert es anschließend mit den Where-Klauseln?

Wenn die Sammlungen im Speicher sind, dann ja. Es gibt keinen Abfrageoptimierer für LinqToObjects - es erledigt einfach, was der Programmierer in der angeforderten Reihenfolge anfordert.

Wenn sich die Sammlungen in einer Datenbank befinden (die aufgrund der myDB-Variablen vermutet wird), dann keine. Die Abfrage wird in sql übersetzt und an die Datenbank gesendet, in der sich ein Abfrageoptimierer befindet. Dieser Optimierer erzeugt einen Ausführungsplan. Da beide Abfragen nach demselben logischen Ergebnis fragen, ist es vernünftig zu erwarten, dass für beide der gleiche effiziente Plan generiert wird. Die einzigen Möglichkeiten, sicher zu sein, ist zu

  • inspizieren die Ausführungspläne
  • oder die IO (SET STATISTICS IO ON) messen.

Gibt es einen Unterschied in der Leistung

Wenn Sie sich in einem Szenario, in dem Sie fragen haben, sollten Sie Werkzeuge, mit denen pflegen für sich selbst die Wahrheit zu messen und zu entdecken. Maßnahme - nicht fragen.