2011-10-19 98 views
5

我已經有了幾個月的實體工作經驗,並且主要爲它編寫了大量的數據檢索linq查詢。我來自一個沉重的sql背景,並且如果我試圖調試性能問題,我正試圖優化一些sql以提高性能和可讀性。實體框架查詢優化

我注意到某些生成的SQL做這樣的事情與列的表A {COL1,COL2,COL3}

select 
    Extent1.col1 
from 
(
    select col1, col2, col3 from tableA 
) AS Extent1 

我的問題是,我該如何阻止它做這些無用的派生表,而只是做

select col1 from tableA 

它需要在哪裏?我似乎無法弄清楚爲什麼它有時會這樣做,有時它不會......

+0

我有興趣聽到別人的想法;但我認爲這只是使用EF(以及其他ORM's)的缺點之一。您對生成的實際SQL失去了很多控制權,生成的SQL通常很糟糕。 – CodingGorilla

+0

可能的重複[改進從實體框架生成的查詢](http://stackoverflow.com/questions/7418675/improve-query-generated-from-entity-framework) –

回答

4

您是否比較了生成的查詢的實際查詢執行計劃和如何優化它?你可能會對結果感到驚訝,我知道我是。我對SQL服務器團隊的開發人員深表敬意,他們似乎做得非常出色,使得看起來像次優查詢的表現完全一樣。

如果您的經歷與我的不同,我會有興趣聽到;我停止了尋找方法來更改生成的查詢,因爲對於我嘗試查看的每個查詢,性能沒有實際差異。

編輯: 我最後的說法不完全正確,同時也有,你必須注意一定N + 1分的情況下,任何批量操作(更新,刪除和多條記錄插入時間)由於與單個記錄一起工作的性質,在手寫查詢方面的表現將不會很接近。但是,無關的擴展盤區基本上被SQL Server查詢優化器剝離出來。

+0

嗨喬爾,一般來說你是正確的,但我有一對夫婦真正討厭的查詢大約有300行,這種「無用的派生表」業務多次遍歷。採取該查詢,並簡單地將派生表替換爲隨後從表中對應的直接選擇,需要從7秒到1秒以內的大量查詢....所以我大多數人都同意你的看法,但試圖瞭解我如何更好地優化我的LINQ,以免我遇到這個問題。 – Zom

+0

@Isamu:通常,如果你可以使你的LINQ查詢更簡單,SQL也變得更簡單。有很多這樣做的技術,但首先沒有任何代碼,很難給出具體的建議。從EF生成的代碼中刪除不必要的列的直接結果是報告的性能增益大於7倍,還是您正在執行更復雜的轉換? – StriplingWarrior

+1

我假設你在測試性能差異時考慮了查詢緩存...... EF團隊博客上有一篇博客文章(http://blogs.msdn.com/b/adonet/archive/2011/07/07/) 25/generated-sql-improvements-for-tpt-queries.aspx),它可以針對與生成的SQL的性能改進相關的特定問題提供反饋。這篇特定的文章談到了他們在最近版本中處理每種類型表繼承層次時所做的改進。 –