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

TOP N vs SET ROWCOUNT N:有索引時效能相當,無序堆積表 TOP N 更快

     編輯:關於SqlServer

結論速查

原理分析

TOP N 執行機制

  • 維護一個 內部排序暫存表 (大小 = N)
  • 掃描資料時,僅在新行符合條件時替換暫存表中「最後一行」
  • 若輸入資料「近乎有序」(初始載入有序、後續少量更新/刪除/轉發指標),僅需極少次插入/刪除操作
  • 近乎有序的堆積表排序效率遠高於大表完整排序

SET ROWCOUNT N 執行機制

  • 在查詢計畫中插入 ROWCOUNT 截斷運算子
  • 不保證輸出順序,除非搭配 ORDER BY
  • 無序輸入時需完整掃描並排序後再截斷

測試數據支撐

  • 相同資料列數,無序插入測試:TOP N 效能下降但仍優於 SET ROWCOUNT
  • I/O 時間兩者相近 (皆需完整掃描)
  • CPU 時間與經過時間顯示「近乎有序堆積表」的 TOP N 效能優勢

最佳實務建議

  • 優先使用 TOP N:語法標準 (SQL-92)、可攜性佳、最佳化器支援完善
  • 搭配 ORDER BY 確保確定性結果
  • SET ROWCOUNT 影響後續所有陳述式,易造成非預期副作用,SQL 2005+ 已標記棄用
  • 分頁查詢:SQL 2005+ 使用 ROW_NUMBER() OVER (ORDER BY ...),SQL 2000 使用 TOP N + 子查詢技巧

語法對照

-- TOP N (建議)
SELECT TOP 10 * FROM orders ORDER BY order_date DESC

-- SET ROWCOUNT (不建議)
SET ROWCOUNT 10
SELECT * FROM orders ORDER BY order_date DESC
SET ROWCOUNT 0  -- 必須重設!
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景TOP NSET ROWCOUNT N說明
有適當索引快快效能相當
無序堆積表更快較慢TOP N 使用內部小型排序暫存表