SQL Server 不保證無
ORDER BY查詢的輸出順序。 實際順序取決於查詢最佳化器選擇的執行計劃(使用哪個索引、掃描方式、平行處理等),任何不加ORDER BY的查詢都可能在統計資料更新、索引重建、平行度變更、參數嗅探等情況下產生不同順序。
AttendanceEmpRankAttendanceEmployeeRankId(叢集索引)DateSELECT * FROM AttendanceEmpRank;
執行計劃:使用 Date 非叢集索引掃描 → 輸出順序依 Date 排序。
SELECT * FROM AttendanceEmpRank ORDER BY AttendanceEmployeeRankId;
執行計劃:使用叢集索引掃描 → 輸出順序依主鍵排序。
兩次查詢輸出順序明顯不同,證明無 ORDER BY 時不走主鍵順序。
ORDER BY 時順序為「實作定義」。| 誤區 | 事實 |
|---|---|
| 「有叢集索引就會依主鍵順序輸出」 | 只有加 ORDER BY PK 或最佳化器剛好選擇叢集索引掃描時才會。 |
| 「插入順序 = 查詢順序」 | 插入順序僅影響叢集索引的物理排列,查詢若走非叢集索引則輸出該索引順序。 |
「加 TOP 不用 ORDER BY 也穩定」 | TOP 無 ORDER BY 時回傳任意 N 列,極不穩定。 |
ORDER BY,哪怕「現在看起來是對的」。OFFSET ... FETCH 或 ROW_NUMBER() 必須搭配確定性 ORDER BY。ORDER BY 並加入回歸測試。ORDER BY 導致排序成本過高,檢查是否有對應索引支援(避免 Sort 運算子)。