談到應用程序的性能調整,有一個試紙性的測試可用來對工作進行優先級劃分:代碼是否訪問數據庫?如果是,頻率是怎樣的?請注意,這一相同測試也可應用于使用 Web 服務或遠程處理的代碼,但是本文對這些內容未做講述。
如果某個特定的代碼路徑中必需進行數據庫請求,并且您認為要首先優化其他領域(如字符串操作),則請停止,然后執行這個試紙性測試。如果您的性能問題不是非常嚴重的話,最好花一些時間來優化一下與數據庫、返回的數據量、進出數據庫的往返頻率相關的花費時間。
了解這些常規信息之后,我們來看一下可能會有助于提高應用程序性能的十個技巧。首先,我要講述可能會引起最大改觀的更改。
技巧 1 — 返回多個結果集
仔細查看您的數據庫代碼,看是否存在多次進入數據庫的請求路徑。每個這樣的往返都會降低應用程序可以提供的每秒請求數量。通過在一個數據庫請求中返回多個結果集,可以節省與數據庫進行通信所需的總時間長度。同時因為減少了數據庫服務器管理請求的工作,還會使得系統伸縮性更強。
雖然可以使用動態 SQL 返回多個結果集,但是我首選使用存儲過程。關于業務邏輯是否應該駐留于存儲過程的問題還存在一些爭議,但是我認為,如果存儲過程中的邏輯可以約束返回數據的話(縮小數據集的大小、縮短網絡上所花費時間,不必篩選邏輯層的數據),則應贊成這樣做。
使用 SqlCommand 實例及其 ExecuteReader 方法填充強類型的業務類時,可以通過調用 NextResult 將結果集指針向前移動。圖 1 顯示了使用類型類填充幾個 ArrayList 的示例會話。只從數據庫返回您需要的數據將進一步減少服務器上的內存分配。
技巧 2 — 分頁的數據訪問
ASP.NET DataGrid 具有一個很好的功能:數據分頁支持。在 DataGrid 中啟用分頁時,一次會顯示固定數量的記錄。另外,在 DataGrid 的底部還會顯示分頁 UI,以便在記錄之間進行導航。該分頁 UI 使您能夠在所顯示的數據之間向前和向后導航,并且一次顯示固定數量的記錄。
還有一個小小的波折。使用 DataGrid 的分頁需要所有數據均與網格進行綁定。例如,您的數據層需要返回所有數據,那么 DataGrid 就會基于當前頁篩選顯示的所有記錄。如果通過 DataGrid 進行分頁時返回了 100,000 個記錄,那么針對每個請求會放棄 99,975 個記錄(假設每頁大小為 25 個記錄)。當記錄的數量不斷增加時,應用程序的性能就會受到影響,因為針對每個請求必須發送越來越多的數據。
要編寫性能更好的分頁代碼,一個極佳的方式是使用存儲過程。圖 2 顯示了針對 Northwind 數據庫中的 Orders 表進行分頁的一個示例存儲過程。簡而言之,您此時要做的只是傳遞頁索引和頁大小。然后就會計算合適的結果集,并將其返回。
在社區服務器中,我們編寫了一個分頁服務器控件,以完成所有的數據分頁。您將會看到,我使用的就是技巧 1 中討論的理念,從一個存儲過程返回兩個結果集:記錄的總數和請求的數據。
返回記錄的總數可能會根據所執行查詢的不同而有所變化。例如,WHERE 子句可用來約束返回的數據。為了計算在分頁 UI 中顯示的總頁數,必須了解要返回記錄的總數。例如,如果總共有 1,000,000 條記錄,并且要使用一個 WHERE 子句將其篩選為 1000 條記錄,那么分頁邏輯就需要了解記錄的總數才能正確呈現分頁 UI。
文章來源于領測軟件測試網 http://www.kjueaiud.com/