2010-09-22 45 views
0

我已經在數據庫中創建了一個視圖,該視圖爲我提供了一個組織結構的表示形式。的確,我在這個視圖中使用了getdate()。我已經在我的edmx中導入了視圖,並根據這個視圖編寫了查詢。大多數查詢與視圖一起加入一個表並返回一個DTO。這些查詢工作正常,並且當我在SQL事件探查器中對其進行概要分析時,速度很快(200ms)。由於查看重新計算,LinQ查詢的持續時間很長

當我在連接表和視圖上做一個組時,那麼持續時間要長得多。奇怪的是,當我執行LinQ查詢的時間非常長,但是當我在SQL Server Management Studio中自己執行生成的查詢時,它非常快。我確定這不是由已經計算的緩存或執行計劃造成的。 LinQ查詢還爲我提供了大量的讀取和寫入,而通過SQL Mgmt Studio進行的查詢不會給我寫入任何信息,而且讀取次數也會減少很多。

我們推測,當通過LinQ執行查詢時需要重新計算視圖,而不是通過SQL Mgmt Studio執行查詢時。

我試過的另一種方法是在數據庫中創建一個存儲過程。這個存儲過程執行與LinQ生成的完全相同的查詢。我已經將這個存儲過程映射到了edmx中。當我再次通過LinQ調用存儲過程時,持續時間非常長(7000毫秒),並且有很多讀寫操作。當我通過SQL Mgmt Studio執行它時,持續時間與預期的一樣(200ms),讀取次數少,沒有寫入。

有什麼建議嗎? 謝謝

+0

你將不得不提供更多的信息給任何人說這個。例如:視圖是怎樣的?你的LINQ查詢是怎樣的? SQL的執行過程如何? – Steven 2010-09-22 10:12:50

回答

0

聽起來像Management Studio正在做某種查詢計劃優化,LINQ無法執行,因爲它執行一系列單獨的命令。

我建議的是嘗試將一組合理的記錄帶入內存並在那裏進行連接。這很容易做到。

假設您有此查詢:

var pcs = 
    from p in dc.People 
    join c in dc.Colors on p.FavColor equals c.Name 
    where p.Name == "James" 
    select new { p.Name, c.ColorId }; 

這將產生一系列查詢到SQL這可能導致延遲的,你所遇到的類型。

那麼試試這個來代替:

var pcs = 
    from p in dc.People.Where(x => x.Name == "James").ToArray() 
    join c in dc.Colors.ToArray() on p.FavColor equals c.Name 
    select new { p.Name, c.ColorId }; 

這應該查詢降低一個或兩個是非常非常快。您只需確保這不會嘗試將50萬條記錄加載到內存中。如果發生這種情況,您的性能問題將從數據庫轉移到內存。

我希望這會有所幫助。