UI 分頁兩大路徑:
| 路徑 | SQL 複雜度 | 程式碼量 | 設計時支援 | 效能 |
|---|---|---|---|---|
| 前端分頁 (撈全表) | 簡單 | 少 | 完整 | 資料量大時極差 |
| 資料庫分頁 (撈單頁) | 視寫法 | 多 | 部分 | 良好,與 SQL 寫法相關 |
本文聚焦資料庫分頁,以 Production.Product (ProductID, Name) 為例。
PageIndex:頁碼 (0-based)PageSize:頁大小RecordCount:總筆數PageCount:總頁數-- 取第 @PageIndex 頁,每頁 @PageSize 筆
SELECT TOP (@PageSize) *
FROM (
SELECT TOP ((@PageIndex + 1) * @PageSize) *
FROM Production.Product
ORDER BY ProductID
) AS t
ORDER BY ProductID DESC
ProductID) 保證確定性。TOP 掃描量大,效能下降。| 版本 | 語法 | 優勢 |
|---|---|---|
| SQL 2005+ | ROW_NUMBER() OVER (ORDER BY ProductID) + CTE 篩選 rn BETWEEN ... | 單掃描、可任意頁碼、支援複雜排序 |
| SQL 2012+ | OFFSET @PageIndex * @PageSize ROWS FETCH NEXT @PageSize ROWS ONLY | 標準 ANSI、最簡潔、最佳化器原生支援 |
OFFSET 深分頁(掃描前 N 列),改用鍵值游標分頁 (WHERE ProductID > @last_seen_id ORDER BY ProductID LIMIT @PageSize)。COUNT(*) 另查,或使用近似值 (sys.dm_db_partition_stats)。從雙重 TOP → ROW_NUMBER() → OFFSET/FETCH,分頁寫法隨版本演進越來越簡潔高效。核心原則:單掃描、索引支援排序、避免深分頁掃描。舊版本維護雙重 TOP 仍可接受,新專案優先 OFFSET/FETCH 或鍵值游標。