預設分頁每次回發皆全表掃描,大數據量下效能災難。SQL Server 2005 引入 ROW_NUMBER() 窗口函數,輕鬆實現真正的自訂分頁:僅回傳當頁資料。
SqlDataSource 每頁載入全表,GridView 切片顯示。百筆資料無感,百萬筆必死。GridView 僅負責顯示。ObjectDataSource 預設亦用預設分頁,但可配置 SelectCountMethod、StartRowIndexParameterName、MaximumRowsParameterName 啟用自訂分頁。WITH PagedData AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderDate DESC) AS RowNum, *
FROM Orders
)
SELECT * FROM PagedData
WHERE RowNum BETWEEN @startRowIndex AND @startRowIndex + @maximumRows - 1
ORDER BY RowNum;
設定 EnableCaching="true" 可減少資料庫往返,但首次仍需全表載入,且面臨過期資料問題。實測:自訂分頁速度仍優於快取模式 2 倍以上。
<asp:ObjectDataSource SelectMethod="GetOrdersPage" SelectCountMethod="GetOrdersCount"
StartRowIndexParameterName="startRowIndex" MaximumRowsParameterName="maxRows" ... />
中介層方法簽章:GetOrdersPage(int startRowIndex, int maxRows)、GetOrdersCount()。