沒有order by語句時結果集是按什麼排序的

我們知道在sql中order by子句用來控制返回的結果集中記錄的順序。那麼當我們的sql沒有提供order by子句時,返回的記錄是按什麼排序的呢。簇索引?主鍵?這是我之前以爲的答案,直到我認真地google了一下這個問題。

答案是,沒有順序,每次的結果不一定。

stackoverflow上有一個哥們回答了這個問題

https://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record

爲了增加自己答案的說服力,他引用了一篇sql server 核心組架構師Conor Cunningham的帖子。這篇帖子大意是這樣的,大家認爲sql語句返回的記錄集是有順序的,通常的原因是,對於相同的sql,數據庫經常使用同一個查詢計劃進行查詢,所以每次返回的結果看起來是相同的。但這並不是固定不變的,我們並不能預見數據庫採用怎樣的查詢計劃。Conor Cunningham在自己的機器上做了一個實驗。一張表只有一個簇索引。向表中插入20k數據,執行一個select語句,數據庫執行了在簇索引上的掃描。向表中插入另外20k數據,再次執行相同的sql, 這一次,數據庫執行了一個並行的查詢計劃,多個thread併發做簇索引掃描,並且把滿足條件的記錄合併起來,這導致了返回的數據集順序不定。通過這個簡單的例子我們確定了,沒有order by子句,就不要期望結果集有順序。

對詳情感興趣的同學可以去閱讀Conor Cunningham的原貼

https://blogs.msdn.microsoft.com/conor_cunningham_msft/2008/08/27/no-seatbelt-expecting-order-without-order-by/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章