2012-07-11 49 views
2

我已經寫了一個非常通用的LINQ查詢,它在整個我的應用程序中都使用,並且對於所有情況都非常適用,但只有一個。我目前只運行SQL Express,因此在我的下載完成之前無法跳入sql profiler,所以在那之前,我的後續LINQ中會出現什麼問題會導致大量減速?與Paging相關的LINQ操作可能會減慢我的查詢速度?

下面是什麼得到執行的總結。 HoldList當然是ToList調用,並且需要30秒。我將這段代碼用於我所有的網格視圖,並且只有一個可以保留它。 MyGridView是一個sql視圖,在問題中,數據只需要2秒鐘即可執行並通過Sql Management Studio返回所有16417個記錄。最後,當我請求頁面接近數據末尾時,這隻需要很長時間,所以我認爲這與Take和Skip實現有些相關。

private void Demo() 
{ 
    // using LINQ To Entity... 
    using (var entities = new MyEntities()) 
    { 
     int page = 1641; 
     int pageSize = 10; 

     IQueryable<MyGridView> results = entities.MyGridView; 

     results = results.Where(r => r.DeletedDate == null); 

     var resultCount = results.Count(); 

     results = ApplyPaging(results, page, pageSize); 

     // On the problem data, ToList takes a good 30 seconds to return just 10 records 
     var resultList = results.ToList(); 
    } 
} 

private IQueryable<T> ApplyPaging<T>(IQueryable<T> data, int currentPage, int pageSize) 
{ 
    if (pageSize > 0 && currentPage > 0) 
    { 
     data = data.Skip((currentPage - 1) * pageSize); 
    } 
    data = data.Take(pageSize); 
    return data; 
} 

任何事情都會因爲壞,錯,危險而跳出來嗎?當我得到安裝的分析器的副本時,我會嘗試通過生成的sql併發布,如果我在那裏找到任何提示。

+0

此代碼中的計數步驟非常快。我只把它包括在內,因爲它是唯一被稱爲的其他東西。所以除非它對查詢有後遺症,否則它不會成立。 – Arkiliknam 2012-07-11 10:10:21

+0

是的,我意識到它會在你遇到下面的問題代碼之前完成的,我的錯誤。 – 2012-07-11 10:10:49

回答

3

http://msdn.microsoft.com/en-us/library/bb357513.aspx#1

跳過方法與LINQ to SQL中非常有用的組織服務器端 結果頁面,並做更多的事情。但是在某些情況下,性能問題 ,因爲LINQ可以從指定的LINQ表達式構建太難的SQL查詢 。 (...)

(...)如果Orgs表中有1000000條記錄,則此查詢將執行很長時間,因爲DB服務器將對記錄進行排序 內存(不太可能有適當的索引,並且所有列的排序均爲 )。即使如此簡單的查詢

orgs.Skip(10).Count之間的()需要的時間顯著量,同時

orgs.Count() - 10個performes更迅速:)

也許這是問題的根源。

+0

因此,如果查詢沒有有效地排序,請跳過查詢。我已經解決了這個問題,只需強制一個OrderBy的ID(默認索引)。不幸的是,當有人要求不同的順序時,它仍然是一個問題,但至少我知道現在的阻礙。 Thanks¬! – Arkiliknam 2012-07-11 12:14:09

+0

@Arkiliknam我很高興我可以幫忙 - 感謝接受答案 – 2012-07-11 12:41:27