在 SQL Server 2005 推出 ROW_NUMBER() 窗口函數之前,開發者通常採用以下兩種方式實現分頁:
SELECT TOP 100 *
FROM tbllendlist
WHERE fldserialNo NOT IN (
SELECT TOP 300100 fldserialNo
FROM tbllendlist
ORDER BY fldserialNo
)
ORDER BY fldserialNo
邏輯是:先跳過前 300,100 筆記錄,再取出後續 100 筆。雖然直觀,但 NOT IN 在大數據量下可能產生較高的 I/O 開銷。
SELECT TOP 100 *
FROM tbllendlist
WHERE fldserialNo > (
SELECT MAX(fldserialNo)
FROM (
SELECT TOP 300100 fldserialNo
FROM tbllendlist
ORDER BY fldserialNo
) AS T
)
ORDER BY fldserialNo
這種寫法先找出第 300,100 筆記錄的最大 ID,再以此為界點向後查詢。實測顯示,方法一在大多數場景下執行速度略快。
自 SQL Server 2005 起,強烈建議改用標準的 OFFSET ... FETCH 或 ROW_NUMBER() 窗口函數,語法更清晰、優化器支援更完善,避免舊寫法的性能陷阱。