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

SQL Server ROW_NUMBER() 不排序技巧:使用 ORDER BY (SELECT 0)

     編輯:關於SqlServer

問題

ROW_NUMBER() 語法強制要求 OVER (ORDER BY ...),但有時只想依資料原本順序編號,不想付出排序成本。

解法

-- 不排序,直接依原始順序產生流水號
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS ROWNUM, *
FROM Product;

-- 分頁查詢範例
WITH query AS (
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS ROWNUM, *
    FROM Product
)
SELECT * FROM query WHERE ROWNUM BETWEEN 5 AND 10;

原理

  • (SELECT 0) 為常數運算式,SQL Server 最佳化器識別為「無排序需求」,直接依輸入順序分配號碼。
  • 執行計畫中不會出現 Sort 運算子,效能提升明顯。

對比:需要排序時

SELECT ROW_NUMBER() OVER (ORDER BY Oper_Date DESC) AS ROWNUM, *
FROM Product;

適用版本

SQL Server 2005 及以上版本皆支援。NHibernate 等 ORM 產生的分頁 SQL 常採用此模式。

注意

  • 「原始順序」在關聯式資料庫無保證(無 ORDER BY 時順序不確定),若業務要求確定順序,請明確指定排序欄位。
  • 僅用於「不在乎順序、只需唯一流水號」的情境(如分頁、暫時編號)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved