如何使大量資料集的 LINQ 查詢發揮最大效率,以建立反應迅速的 UI

在八月份的 MSDN Magazine 中有文章在探討這個問題。

 

問題描述如下:

我在最近的一個專案中,為一組 XML 資料設計了字串搜尋 (Word Wheel Search) UI,其中使用 LINQ-to-XML 查詢來篩選資料。字串搜尋可以讓使用者在一組資料中,執行以字為基礎的搜尋。顯示的結果會包含與使用者輸入之文字相符的子字串。使用者輸入時會自動更新結果,提供立即的反應。

我使用產生的 XML 檔案,來設計和實作字串 UI。使用者可以在文字方塊中鍵入文字,結果會隨著輸入的文字持續縮小範圍,僅篩選出其中包含所輸入文字之子字串的項目。UI 符合設計規格,而且在我的測試環境中有很好的回應效率。專案的其餘部分完成之後,我的程式碼便開始產生實際執行的 XML 檔案,於是我簽入新的程式碼,然後就回家了。但是第二天早上,我發現 QA 提出許多 UI 的問題。UI 變得反應遲緩,到了無法使用的地步。

我以為這只是其中一個查詢條件的瓶頸,所以想說可以輕易解決。不過在分析 UI 並將查詢最佳化之後,我發現還是無法將效能改進到可接受的程度。問題不在於查詢的效率,而是因為有大量的資料造成阻塞。測試用的 XML 檔案只包含 5,000 到 10,000 個項目,但實際執行的 XML 檔案卻有大約 40 倍的資料量。即使使用超快的查詢功能,在沒有內建索引的情況下搜尋幾十萬個資料列,還是會變得非常遲鈍。

我必須找出一個方法來加快搜尋程序,所以我決定利用下列 LINQ 特殊功能來提升效能:延遲執行和延遲評估。使用這些功能,LINQ 的查詢就不會在其定義點執行。而是會改為在列舉結果時執行。這可以讓您在使用查詢結果時有效地捲動資料,進而提供極大的彈性。

 

想知道作者如何解決這個問題及取得完整的範例,請參考:提升 LINQ 的查詢效能

 

Hope this help.