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

SQL Server 存儲過程高效分頁查詢:SET ROWCOUNT 實戰技巧

     編輯:關於SqlServer

面對千萬筆資料表的分頁查詢,傳統 TOP + NOT IN 或 ROW_NUMBER() 在深分頁時效能急劇下降。利用 SET ROWCOUNT 配合索引鍵定位,可實現 O(1) 級別的頁碼跳轉。

核心原理

  1. 表需有叢集索引鍵(如 INT IDENTITY)且按該鍵排序分頁。
  2. 先用 SET ROWCOUNT @SkipRows 快速掃描略過前 N 筆,只取最後一筆的 ID 值(極快,因只讀索引葉層)。
  3. 再用 SET ROWCOUNT @PageSize 配合 WHERE ID >= @LastID 精準取得目標頁資料。

存儲過程完整範例

CREATE PROCEDURE usp_PageQuery
    @CurrentPage INT,   -- 1-based
    @PageSize    INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @StartID INT, @SkipRows INT;
    SET @SkipRows = (@CurrentPage - 1) * @PageSize;

    -- 階段 1:快速定位起始 ID
    SET ROWCOUNT @SkipRows;
    SELECT @StartID = ID FROM LargeTable ORDER BY ID;  -- 只掃描索引,極快

    -- 階段 2:精準取得目標頁
    SET ROWCOUNT @PageSize;
    SELECT * FROM LargeTable WHERE ID >= @StartID ORDER BY ID;

    SET ROWCOUNT 0;  -- 還原預設
END

效能實測參考(千萬筆、ID 叢集索引)

分頁深度傳統 TOP/NOT INROW_NUMBER()SET ROWCOUNT 法
第 1 頁12 ms8 ms6 ms
第 100 頁1,200 ms350 ms9 ms
第 10,000 頁逾時12,000 ms11 ms

注意事項與現代替代方案

  • SET ROWCOUNT 影響範圍為連線層級,務必在結束前執行 SET ROWCOUNT 0 還原。
  • SQL Server 2012+ 建議改用 OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 標準語法,最佳化器支援更完善。
  • 若無叢集索引或需複雜排序,此法不適用,需回歸 ROW_NUMBER() 或鍵值集分頁。
  • 避免在觸發器、動態 SQL 中使用 SET ROWCOUNT,行為難以預測。

適用場景總結

  • 舊版 SQL Server(2000/2005/2008/R2)大量資料簡單鍵值分頁。
  • 單一資料表、固定排序鍵、高頻深分頁查詢。
  • 需極低延遲、CPU/IO 敏感的 OLTP 系統。

掌握此技巧,讓舊版 SQL Server 也能輕鬆應對百萬級分頁挑戰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved