首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server 2005 高效分頁寫法三種模式對比

     編輯:SQL Server 2005

三種常見分頁寫法

假設每頁 10 筆,查詢第 @Page 頁,條件 username = 'user'。

模式 1:雙重 TOP + ROW_NUMBER()

SELECT TOP 10 * FROM (
    SELECT TOP (@Page * 10) ROW_NUMBER() OVER (ORDER BY id) AS RowNum, id, username
    FROM Guest WHERE username = 'user'
) AS T
WHERE RowNum > ((@Page - 1) * 10)

特點:內層只取前 N 頁資料,外層再過濾。早期 SQL Server 2005 常見寫法,但內層 TOP 可能導致排序運算子處理過多列。

模式 2:單層 CTE/子查詢 + BETWEEN

SELECT * FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNum, id, username
    FROM Guest WHERE username = 'user'
) AS T
WHERE RowNum BETWEEN 31 AND 60  -- 第 4 頁(每頁 10 筆)

特點:語法簡潔,執行計劃穩定,適合大多數場景。

模式 3:CTE (Common Table Expression) 寫法

WITH T AS (
    SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNum, id, username
    FROM Guest WHERE username = 'user'
)
SELECT * FROM T
WHERE RowNum BETWEEN 31 AND 60

特點:可讀性最佳,支援遞歸查詢,效能與模式 2 相同(優化器會展開為相同計劃)。

效能建議

  • 確保 ORDER BY 欄位有索引(最佳為覆蓋索引)。
  • 避免在 OVER() 中使用複雜運算式,影響索引使用。
  • 深分頁(大頁碼)時,考慮「延遲關聯」:先只查主鍵 ID,再 JOIN 回表取明細。
  • SQL Server 2012+ 可使用 OFFSET ... FETCH 標準語法,更簡潔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved