我們知道在sql中order by子句用來控制返回的結果集中記錄的順序。那麼當我們的sql沒有提供order by子句時,返回的記錄是按什麼排序的呢。簇索引?主鍵?這是我之前以爲的答案,直到我認真地google了一下這個問題。
答案是,沒有順序,每次的結果不一定。
stackoverflow上有一個哥們回答了這個問題
爲了增加自己答案的說服力,他引用了一篇sql server 核心組架構師Conor Cunningham的帖子。這篇帖子大意是這樣的,大家認爲sql語句返回的記錄集是有順序的,通常的原因是,對於相同的sql,數據庫經常使用同一個查詢計劃進行查詢,所以每次返回的結果看起來是相同的。但這並不是固定不變的,我們並不能預見數據庫採用怎樣的查詢計劃。Conor Cunningham在自己的機器上做了一個實驗。一張表只有一個簇索引。向表中插入20k數據,執行一個select語句,數據庫執行了在簇索引上的掃描。向表中插入另外20k數據,再次執行相同的sql, 這一次,數據庫執行了一個並行的查詢計劃,多個thread併發做簇索引掃描,並且把滿足條件的記錄合併起來,這導致了返回的數據集順序不定。通過這個簡單的例子我們確定了,沒有order by子句,就不要期望結果集有順序。
對詳情感興趣的同學可以去閱讀Conor Cunningham的原貼