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

TOP N vs SET ROWCOUNT N 效能對比:有索引同速、無序堆 TOP N 勝出

     編輯:關於SqlServer

結論速覽

  • 有適當索引:TOP N 與 SET ROWCOUNT N 效能相當。
  • 無序堆:TOP N 明顯更快。

原理深度解析

有索引情況

優化器利用索引順序直接取得前 N 列,兩種寫法產生相同執行計畫,I/O、CPU、耗時皆同。

無序堆情況

TOP N 運算子內部維護一個 小型排序暫存表,僅保留目前前 N 列:

  • 讀取新列 → 與暫存表最後一列比較 → 較小則替換最後一列並重新排序。
  • 若輸入資料 近似有序 (初始載入有序、後續少量更新/刪除/轉發指標),替換極少發生,極高效。
  • 近似有序堆排序成本遠低於完整大表排序。

SET ROWCOUNT N 則在執行計畫中設定行數目標,但無專用運算子優化,往往退化為完整掃描 + 排序 + 截斷。

實測數據支撐

  • I/O 時間:有無索引皆相同 (必須讀取所有列)。
  • CPU 與經過時間:顯示近似有序堆的高效率。
  • 無序插入測試:TOP N 效能下降,但仍優於 SET ROWCOUNT N。

最佳實踐建議

  1. 優先使用 TOP N (ANSI SQL:2008 FETCH FIRST N ROWS ONLY)。
  2. 關鍵查詢務必建立支援排序的索引,消除排序運算子。
  3. 避免使用 SET ROWCOUNT N,已被標記為不推薦 (未來版本可能移除),且影響 INSERT/UPDATE/DELETE 行數限制易發生邏輯錯誤。
  4. SQL Server 2012+ 使用 OFFSET ... FETCH 進行標準分頁。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved