[SQL SERVER]排序疑問

今天收到某學員來信詢問?

學員:老師課堂用實例說明QO可能會改寫查詢以及排序資料,

但今天系統某一查詢資料排序卻和以往都不同,

而且該查詢都沒有人修改過,請問是什麼原因造成的呢?

RiCo:你能把該查詢XML執行計畫寄給我分析嗎?

 

我在課堂上透過實例闡述QO如何改寫查詢,

同時我也提到Order by問題。資料表存在叢集索引,

那麼資料將依叢集索引Key排序,

如查詢使用到非叢集索引,那資料也會依照非叢集索引Key排序,

就算查詢陳述句沒明確使用Order by,而這就是隱式排序。

 

回到該學員問題,資料表有叢集索引,

查詢也有使用到叢集索引,但資料結果卻沒依照叢集索引Key排序,

該查詢都沒人修改過,但突然這幾天資料排序卻亂了。

我分析完執行計畫後,現在我來簡單重現該學員排序疑問。

(42 個資料列受到影響)

查看執行計畫可以確認查詢使用叢集索引,並且資料依照叢集索引Key(c1)排序。

 

現在我增加1萬筆資料後再來看看會發生什麼事情。

太Lucky了,我得到了平行查詢計畫,雖然這可以提高大查詢效能。

可以看到這時資料卻沒依照叢集索引Key(c1)排序,

這是因為執行計畫變更為平行執行計畫所導致(因排序需要大量page),

多執行序處理後進行merge基本上不保證資料排序。

 

如排序資料會造成使用者困擾,那請明確加上Order by,

才不會因執行計畫變更導致結果非預期。