2012-12-19 53 views
1

我有由.NET Entity Framework 3.5(已經對EF 3.5進行了優化,我們將很快升級到4)生成的SQL語句,並在2005 SQL Server上運行。我知道有很多文章談論SQL性能,但是我沒有找到解決我的問題的具體解決方案。 我需要這種情況的參考或解決方案: 在ASP.NET應用程序中有一個包含特定信息(類似6-7列)的表,當用戶對錶執行排序操作時,需要7 -15秒來檢索信息(...由於應用程序是業務內部的,這是糟糕的表現)。SQL語句性能審查

我跑usp_Worst_TSQL從文章: http://www.databasejournal.com/features/mssql/article.php/3802936/Finding-the-Worst-Performing-T-SQL-Statements-on-an-Instance.htm和我得到表現在哪裏的問題來自於:有使用多個嵌套查詢的WHERE,INNER & LEFT JOIN和ORDER BY子句。

創建有關語句中的SQL語句子句的索引有哪些注意事項? 什麼時候需要製作複合索引?

編輯: 我設法從問題出在哪裏。我有這個LINQ和foreach循環中的代碼,這需要3個全秒獲得數據:

foreach (string status in searchObj.Statuses) 
{ 
from f in tblFormsQO 
where f.tblFormStatus.Count > 0 && f.tblFormStatus.Count(s => s.StatusDate == null) == 0 
&& f.tblFormStatus.OrderByDescending(s => s.StatusDate).FirstOrDefault().CurrentStatus.CodeDesc == status 
select f 
} 

現在,f是不是一個大的實體(我的確有它的所有屬性)。 有什麼辦法可以讓它表現更好?

+0

這是一種需要勇氣寫答案的問題。從EF中生成的SQL與性能問題混合在一起,而不是句子中的代碼示例。 – danihp

+3

你的問題沒有提供很多範圍的答案,但我會建議,如果它採取7-15s執行查詢,它可能不會寫得很好。索引可能會提高性能,但是您應該仔細查看查詢實際上嘗試嵌套的內容。我寫了一張備忘單,以便從EF Performance中獲得最佳效果,可在此處獲得:http://blog.staticvoid.co.nz/2012/08/entity-framework-performance-cheat-sheet.html。我建議你在橙色框 –

+0

是的,我知道,我會編輯問題... :-) ...問題是生成的查詢太長,我想我需要3個問題只是爲了顯示查詢的重要部分... – lionheart

回答

1

該foreach循環平均迭代了多少次?您可以先將數據加載到內存中,然後對緩存數據使用linq將比foreach潛在生成的多個sql語句快得多。

這可能無法解決問題的根源,但只是基於我所看到的建議。

編輯:

你原來的問題必須考慮索引。我將找出正在發送的實際查詢的內容,然後使用選項生成執行計劃,然後在SQL Management Studio中自行運行它們。通過這種方式,您可以從SQL中獲取有關可能加快查詢速度的索引的建議。

關於一般添加索引的注意事項,如果您擔心插入/刪除數據的速度,這只是一個問題。你有更多的索引會減慢這些操作。否則,添加你喜歡的所有索引。並確保你有一個聚集索引,因爲這可能會加速所有其他索引。

+0

謝謝,可以有多達9循環的foreach ...問題是,在tblFormsQO中,可能有很多記錄 - 這就是爲什麼我無法緩存所有tblFormsQO記錄並對它們進行處理......這是一個折衷問題。 – lionheart

+0

您'可以'構建一個能夠一次獲得所有狀態的單個查詢(除非您說的數據太多,您一次只能處理一個狀態的記錄)。但我同意這不是問題的根源。但是,根據您的情況,您可能可以多線程處理forloop,以便它們都可以同時處理。可能不是我猜測的選項,但只是想我會把它扔到那裏,以防萬一。 –

+0

也就是說,對於所有狀態,forloop會提起...不是'所有'狀態,但希望這很明顯,我的意思。 –