2010-06-10 9 views
5

W oparciu o to pytanie: What is difference between Where and Join in linq?LINQ - Używanie miejsca lub dołączenia - Różnica w wydajności?

Moje pytanie jest następujące:

Czy istnieje różnica wydajności w dwóch następujących stwierdzeń:

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 }; 

i

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 }; 

bym zawsze używaj drugiego tylko dlatego, że jest bardziej przejrzysty.

Moje pytanie jest teraz, czy pierwsze jest wolniejsze od drugiego? Czy tworzy produkt kartowy i filtruje go później z klauzulami where?

Dziękuję.

Odpowiedz

3

Wszystko zależy od dostawcy, z którego korzystasz.

Z LINQ to Objects, to absolutnie zbuduje produkt kartezjański i filtr następnie.

Dla dostawców zapytań pozaprocesowych, takich jak LINQ do SQL, zależy to od tego, czy jest wystarczająco inteligentny, aby zdać sobie sprawę, że może przetłumaczyć go na połączenie SQL. Nawet jeśli LINQ to SQL, nie jest prawdopodobne, że silnik zapytań faktycznie wykonujący zapytanie zrobi to - musisz sprawdzić za pomocą odpowiedniego narzędzia do planowania bazy danych, aby zobaczyć, co się właściwie stanie.


Side-uwaga: wiele „z” klauzule nie zawsze skutkować iloczyn kartezjański - zawartość jednej „od” może zależeć od aktualnego elementu wcześniejszych, na przykład

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

Bardzo dobra odpowiedź, a przy użyciu łączenia wydajność powinna być lepsza? – kamahl

+0

@Patrick: wydajność zależy od dokładnej sytuacji. Jeśli LINQ do SQL konwertuje go do tego samego SQL, to oczywiście nie będzie to miało znaczenia. Ale tak, generalnie połączenie * powinno * działać lepiej. Jestem pewien, że są wyjątkowe przypadki, w których to by nie było :) –

1

Moje pytanie jest teraz, jest pierwszym wolniej niż drugi? Czy tworzy produkt kartowy i filtruje go później za pomocą klauzul where?

Jeśli zbiory są w pamięci, następnie tak. Nie ma optymalizatora zapytań dla LinqToObjects - po prostu robi to, o co prosi programista w zadanej kolejności.

Jeśli zbiory znajdują się w bazie danych (co jest podejrzane ze względu na zmienną myDB), , a następnie. Kwerenda jest tłumaczona na sql i wysyłana do bazy danych, w której znajduje się optymalizator zapytań. Ten optymalizator wygeneruje plan wykonania. Ponieważ oba zapytania wymagają tego samego wyniku logicznego, uzasadnione jest oczekiwanie, że dla obu zostanie wygenerowany ten sam wydajny plan. Jedyne sposoby, aby mieć pewność mają

  • skontrolować wykonanie planuje
  • lub zmierzyć IO (SET STATYSTYKI IO).

Czy istnieje różnica wydajności

Jeśli znajdziesz się w sytuacji, w której trzeba zapytać, należy pielęgnować narzędzi, z którymi zmierzyć i odkryć prawdę o sobie. Zmierz - nie pytaj.

Powiązane problemy