2010-06-10 51 views
5

What is difference between Where and Join in linq?LINQ - 使用where或join - 性能差異?基於這個問題

我的問題是以下幾點:

是否有以下兩個語句的性能差異:

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

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

我會因爲它更清楚,總是使用第二個。

我現在的問題是,第一個比第二個慢嗎? 是否構建cartesic產品並使用where子句過濾?

謝謝。

回答

3

完全取決於您使用的提供商。

使用LINQ to Objects,它將絕對構建笛卡爾積,然後過濾。

對於進程外查詢提供程序(如LINQ to SQL),它取決於它是否足夠聰明以實現將其轉換爲SQL連接。即使LINQ to SQL沒有,那麼查詢引擎實際執行查詢的可能性也會如此 - 您必須查看數據庫的相關查詢計劃工具才能看到實際發生的情況。


側面說明:多個「從」條款並不總是導致笛卡爾積 - 一個內容「從」可以依靠早期的,例如當前元素

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

非常好的答案,並使用連接的性能應該會更好? – kamahl 2010-06-10 12:24:41

+0

@帕特里克:表演將取決於確切的情況。如果LINQ to SQL將其轉換爲相同的SQL,那麼顯然這不會有什麼區別。但是,是的,通常一個連接*應該*表現更好。我確信有例外的情況下它不會通過:) – 2010-06-10 12:35:28

1

我的問題是,現在,比第二個更慢的第一個?它是否構建了cartesic產品並使用where子句過濾?

如果收藏品在內存中,則然後是。 LinqToObjects沒有查詢優化器 - 它只是按程序員詢問的順序進行操作。

如果這些集合位於數據庫(懷疑是由於myDB變量引起的),那麼然後是。查詢被翻譯成sql併發送到有查詢優化器的數據庫。這個優化器將生成一個執行計劃。由於兩個查詢都要求相同的邏輯結果,因此期望爲兩者生成相同的高效計劃是合理的。唯一的辦法肯定是

  • 檢查執行計劃
  • 或測量的IO(SET STATISTICS IO ON)。

是否有性能差異

如果你發現自己在哪裏,你要問一個場景中,你應該培養一種衡量和發現真理爲自己的工具。措施 - 不要問。