2013-02-06 77 views
0

我將首先描述業務案例。如果您只是想要提出這個問題,請稍後跳過幾段...針對特定LINQ for SQL查詢的SQL Server表索引

我正在通過Web在ASP.NET Web API服務器上同步.NET移動客戶端上的數據。由於客戶端的「移動性」,我希望該過程儘可能高效,因此我希望實現增量同步,這意味着客戶要求從指定日期開始新條目,這通常會是最後的同步日期。

我正在處理單獨的條目刪除,所以爲了簡單起見,我們將重點放在新條目和修改條目上。

正在同步的表太大而不適合單個響應,因此實現了分頁。

表中的每個條目具有唯一的ID LASTUPDATED柱。在服務器上,我使用以下代碼來響應請求的頁面:

var set    = Model.Set<T>().Where(t => String.Compare(t.LastUpdated, fromDate, StringComparison.Ordinal) >= 0).OrderBy(t => t.Id); 
var queryResultPage = set.Skip(pageSize * pageNumber).Take(pageSize); 

return queryResultPage.ToList(); 

Model.Set是從中檢索數據的DbSet。請忽略我必須使用字符串來表示日期的事實...

我的問題是,什麼SQL Server表索引會產生最佳性能這種情況下

+2

這不是一個真正的linq-to-sql問題,而是更多的SQL服務器。剖析SQL,在SQL管理工作室中輸入它並檢查查詢計劃。這會給你一個很好的起點。 – Pleun

回答

1

Pleun完全正確。我最近在CRM 2011平臺上爲客戶做了一個演示。我向他們展示了一種情況,在通過2.2M記錄和額外的4.5M記錄進行排序後,頁面視圖花費約30秒時間來加載頁面。

使用SQL事件探查器,您可以找到正在運行的查詢。 把它放進SQL Management Studio中(清理必要使它標準SQL) 然後運行執行計劃,並尋找它表明指數(尤其是那些它說失蹤)

不管怎樣,在我的演示給我的客戶,在我們完成這個之後,查詢下降到不到一秒;並在大約4秒鐘加載頁面(這仍然可憐)。

+0

感謝Pleun和Mike。很高興知道你可以剖析LINQ2SQL。我找到了一個名爲LINQPad的可愛工具,它顯示了生成的SQL,我將它複製到SSMS並查看預計的執行計劃。我還追溯了SQL Server分析器中的查詢。所以我在這個「良好的起點」,但接下來呢?我在哪裏可以找到建議的索引? – ury

+0

如果執行計劃發現不存在的索引會加速性能,它將顯示爲執行計劃上方的一行綠色文本。如果沒有綠色文字,那麼要麼沒有建議,要麼你做錯了= / –