2011-03-25 57 views
2

我複製從SQL事件探查LINQ內置SQL查詢這裏是很煩人一下:Linq查詢超級慢?

  1. 它的前綴選擇..columnNames ..從(選擇..columnNames ..從(選擇視圖的CNAME) 點評:2條SELECT語句這裏是不必要的

  2. 此查詢需要14秒,執行

  3. 當我刪除的最後一行,包含類似的@p_ LINQ _0所有PARAMS。 ..並在條件中填寫參數值並執行完全相同的動態查詢,這需要1秒或更少的時間。否則,這個查詢在從sql studio執行時需要0秒。這是linq的跛腳。

我可能會移動到這個存儲過程,但我很害怕使用LINQ現在

經過進一步研究中,我發現:

查詢1:

exec sp_executesql N'SELECT * from TableView WHERE Id = @Id', N'@Id int', @Id = 1 

查詢2 :

exec sp_executesql N'SELECT * from TableView WHERE Id = 1' 

查詢1需要12秒,查詢2需要0秒。這解釋了爲什麼linq查詢很慢。所以,現在,這是否意味着我應該總是使用存儲過程還是缺少一些東西?

爲什麼不能微軟修復Linq查詢建築,難的是如何解析該字符串和替換,而不是通過那些PARAMS作爲參數傳遞給sp_executesql的

+2

你在說什麼查詢? – Joren 2011-03-25 18:36:17

+2

這裏有問題嗎? – forsvarir 2011-03-25 18:36:20

+6

沒有看到LINQ查詢或生成的SQL,很難給你任何幫助。 – 2011-03-25 18:36:37

回答

6

我與你帕拉姆值。我的意思是,您可能會發現您發現的災難性表現的原因並找到補救措施。但是在實踐中,Linq to SQL會發生這種事情,並花費額外的時間來優化您的Linq語句,以便SQL查詢在後端方面更加高效,從而失敗了目的。 Linq應該讓事情變得更容易。

就我個人而言,我使用Linq-to-SQL或實體框架對單個記錄執行CRUD操作。然後用任何大型的SELECT聲明,我會直接寫一個存儲過程,就像我一直以來一樣。這似乎是生產力和性能之間的良好折中,對我而言效果很好。

編輯: 實際上,實體框架傢伙預計這一點。實體框架在存儲過程中效果很好。你可以add a stored proc to your Entity Framework model並獲得所有強類型的善良。然後你可以從代碼中調用存儲過程。

+1

您也可以將存儲過程添加到Linq to SQL。請參閱http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx和http://weblogs.asp .net/scottgu/archive/2007/08/23/linq-to-sql-part-7-updates-our-database-using-stored-procedures.aspx – 2011-03-28 18:37:41

0

當謂語動態取出應用特定daysRange 像這樣

var query = from v in tableView 
      where v.Id == Id 
      orderby v.RDate descending 
      select v; 

if(!daysRange.Equals("All")) 
{ 
    query = query.Where(v => v.RdDate >= fromDate && v.RDate <= toDate); 
} 

query.ToList(); 
+0

這不會造成任何區別Sir,I've tried一切。這個問題歸結爲我在「經過進一步研究後」的問題中所更新的內容。 – WhoIsNinja 2011-03-25 19:15:06

0

這工作,你應該建立的。

ParameterExpression parameterExpression = Expression.Parameter(typeof(TableView), "v"); 
Expression equalsExpression = Expression.Equal(Expression.Property(parameterExpression, "Id"), Expression.Constant(Id)); 
Expression<Func<TableView, bool>> predicate = Expression.Lamda<Func<TableView, bool>>(equalsExpression, parameter); 

var query = from v in tableView 
      orderby v.RDate descending 
      select v; 

if(!daysRange.Equals("All")) 
{ 
    query = query.Where(v => v.RdDate >= fromDate && v.RDate <= toDate); 
} 

query.Where(predicate).ToList();