SELECT TOP (@PageSize) * FROM TableName
WHERE ID NOT IN (
SELECT TOP ((@PageIndex-1)*@PageSize) ID FROM TableName ORDER BY ...
)
ORDER BY ...
DECLARE @Temp TABLE (RowID INT IDENTITY(1,1), ID INT, ...);
INSERT INTO @Temp (ID, ...) SELECT ID, ... FROM TableName ORDER BY ...;
SELECT * FROM TableName t JOIN @Temp tmp ON t.ID = tmp.ID
WHERE tmp.RowID BETWEEN @Lower AND @Upper;
WITH CTE AS (
SELECT ROW_NUMBER() OVER (ORDER BY ...) AS RowNum, *
FROM TableName
)
SELECT * FROM CTE WHERE RowNum BETWEEN @Lower AND @Upper;
| 頁碼 | TOP N | CTE | 臨時表(冷) | 臨時表(熱) | 舊論壇SP | CTE優化 |
|---|---|---|---|---|---|---|
| 1 | 3 | 12 | 10 | 101 | 457 | 7302 |
| 3 | 15 | 7 | 79 | 5524 | 464 | 7191 |
| 10 | 127 | 5504 | 88 | 3801 | 464 | 6116 |
| 32 | 588 | 9672 | 122 | 3601 | 976 | 7602 |
| 100 | 4680 | 9738 | 166 | 4235 | 486 | 7151 |
| 316 | 45271 | 9764 | 323 | 3867 | 522 | 7255 |
| 1000 | 失敗 | 9806 | 869 | 2578 | 635 | 8948 |
| 10000 | 失敗 | 9754 | 7812 | 11926 | 14250 | 7359 |
| 100000 | 失敗 | 失敗 | 31538 | 55569 | 17139 | 6124 |

圖表直觀展示:TOP N 前期領先後崩潰;臨時表冷啟動慢穩定;CTE 優化版曲線最平滑,適合未知分頁深度的通用場景。