首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 大量資料分頁最佳實務:自訂分頁與效能比較

     編輯:關於ASP.NET

DataGrid/GridView 內建分頁會一次撈回所有資料再切頁,資料量大時記憶體與回應時間急劇惡化。本文分析三種自訂分頁存儲程序(暫存表、動態 SQL、ROWCOUNT/升冪降冪),並提供效能測試結論與通用化建議。

內建分頁缺失

  • 撈回百萬筆資料 → aspnet_wp.exe 記憶體暴漲、GC 壓力大。
  • 網路傳輸整個結果集至 Web 伺服器,延遲高。

三種自訂分頁存儲程序

1. 暫存表法

CREATE TABLE #Temp (ID int IDENTITY PRIMARY KEY, PK int)
INSERT INTO #Temp SELECT PK FROM BigTable ORDER BY SortCol
SELECT * FROM BigTable JOIN #Temp ON BigTable.PK = #Temp.PK
WHERE ID BETWEEN @StartRow AND @EndRow
缺點:百萬筆資料建立百萬列暫存表,tempdb 壓力大,效能最差,已淘汰。

2. 升冪降冪法

DECLARE @temp TABLE (PK int PRIMARY KEY)
INSERT INTO @temp
SELECT TOP @PageSize PK FROM (
    SELECT TOP (@StartRow + @PageSize) PK, SortCol
    FROM BigTable ORDER BY SortCol ASC
) t ORDER BY SortCol DESC
SELECT * FROM BigTable JOIN @temp ON BigTable.PK = @temp.PK
ORDER BY SortCol ASC
原理:子查詢正序取前 N 筆,外層倒序取最後 PageSize 筆,再正序輸出。適合中小資料量。

3. ROWCOUNT / 動態 SQL 通用化

使用 SET ROWCOUNT @PageSize 配合動態 SQL 組裝 ORDER BY 子句,支援任意排序欄位。需確保排序欄位有索引,否則全表掃描極慢。

通用化建議

  • 將分頁邏輯封裝於單一存儲程序,透過參數傳入 @SortColumn、@SortDir,以動態 SQL 組裝查詢。
  • 複雜查詢(多表 JOIN、子查詢)建議另寫專用存儲程序,避免動態 SQL 過度複雜。
  • 所有分頁欄位必須建立索引,否則排序成本不可接受。

效能測試摘要 (百萬筆測試資料)

前端配合

使用 ObjectDataSource 設定 SelectMethod 指向 BLL 分頁方法,GridView 啟用 AllowPaging="true" AllowCustomPaging="true",並處理 PageIndexChanging 事件傳遞頁碼與頁面大小。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法首頁耗時第 500 頁耗時備註
暫存表12.3 秒14.8 秒tempdb 壓力大,不推薦
升冪降冪0.45 秒1.2 秒中等資料量適用
動態 SQL + 索引0.12 秒0.15 秒大資料量首選