Sql-Server
聚集索引和排序
select * from [table_a];
聚集索引根據您選擇的任何列對錶進行排序。
話雖如此,如果我有一個聚集索引
[column_a], [column_b],
並[column_c]
從上面執行相同的查詢,數據是否總是會根據該順序返回,因為這是創建聚集索引的順序?更多說明:
如果我
ORDER BY
在索引中沒有的東西上添加一個子句,執行計劃將有一個排序運算符。如果我
ORDER BY
對聚集索引中使用的所有列都有一個子句,則執行計劃將沒有排序運算符。這就是為什麼我首先問這個問題。
如果我有一個聚集索引
$$ column_a $$,$$ column_b $$, 和$$ column_c $$並從上面執行相同的查詢,數據是否總是會根據該順序返回,因為這是創建聚集索引的順序?
不。
SQL Server 不保證它將以任何順序返回數據,除非您指定順序。通過簡單地創建一個覆蓋不同列的非聚集索引,很容易證明事情可能會出錯:
但是事情也可能以其他方式發生變化,例如,當並行性或分區發揮作用並且 SQL Server 重新組合來自不同執行緒的數據時,或者當查詢變得更加複雜時,使用聯接或過濾器以及除集群之外的不同計劃時索引掃描是有意義的。省略 order by 子句是在告訴 SQL Server:“我不關心順序。”
另外,作為一個澄清點:
如果我對聚集索引中使用的所有列都有 ORDER BY 子句,則執行計劃將沒有排序運算符。
…僅當列以與鍵定義完全相同的順序列出時,這才是正確的。
ORDER BY c, b, a
是“所有列”,但它顯然會產生不同的輸出(並且需要某種類型的排序操作才能到達那裡)。如果您期望並且希望對依賴某個順序感到滿意,請始終使用 ORDER BY 子句。
進一步閱讀:
- 沒有安全帶 - 期待沒有 ORDER BY 的訂單(Conor Cunningham)
- 沒有 ORDER BY,就沒有預設的排序順序。(亞歷山大·庫茲涅佐夫)
- T-SQL 星期二 #56:SQL Server 假設(我 - 見 #3)
- 踢壞習慣:依賴無證行為(也是我)
以及之前的問題: