2010-07-30 80 views
2

有兩種選擇來處理LINQ到用SQL填充的集合(我使用的是Oracle提供程序,所以沒有沒有ORM的LINQ)。LINQ到SQL/LINQ到集合性能

  1. 做一個大的SQL查詢,結果轉儲成某種收集和做收集LINQ查詢,讓您擁有對數據庫的一個很大的吸引力,但之後沒有太多的經濟放緩。

  2. 執行小型SQL查詢並將結果轉儲到許多較小的集合中,並對這些集合執行LINQ查詢,因此您對數據庫的繪製較小,但在整個應用程序中會更一致地減速。

任何人對此有任何想法?

回答

3

這兩種方法之間有一個很大的區別:如果每次需要數據時查詢數據庫,都會得到最新的數據,而如果您一次讀入所有數據並重復使用,那麼您將在再次閱讀所有內容之前,不要看到最新的更改。兩種系統都有優點和缺點,但您需要了解這種差異。

關於性能差異 - 不要認爲本地數據上的LINQ to Objects總是比數據庫查詢更快。數據庫針對不同類型的查詢進行了令人難以置信的優化,並且可以利用索引。 LINQ to Object查詢通常只是遍歷整個數據集。因此,即使您在本地獲得數據,除非您自己努力爲數據編制索引,但某些查詢實際上可能比獲取數據庫執行該工作時慢。

即使對於不能使用索引的查詢,數據庫仍然可以擊敗天真的LINQ to Objects方法。數據庫有一些非常先進的算法,這些算法在LINQ to Objects中沒有實現。例如,一個常見的查詢是使用過濾器獲取按照某些條件排序的前100個項目。即使沒有足夠大的結果集的可用索引,數據庫可能仍然優於LINQ to Objects,因爲OrderBy(x => x.Foo).Take(100)將首先執行O(n log n)排序,然後取出前100個元素並丟棄其餘元素。 SQL Server團隊知道這種類型的查詢很常見,因此他們添加了一個特殊的優化調用TOP N SORT,它可以在O(n)時間內執行此操作。我想象Oracle有一個類似的優化。我已經編寫了another answer,詳細介紹了這一點,包括LINQ to SQL與LINQ to Objects查詢的一些性能測量。

+0

不夠公平,但假設數據庫是以這種方式進行優化的確是個好主意? – Riddari 2010-08-03 15:23:28