今天收到某學員來信詢問?
學員:老師課堂用實例說明QO可能會改寫查詢以及排序資料,
但今天系統某一查詢資料排序卻和以往都不同,
而且該查詢都沒有人修改過,請問是什麼原因造成的呢?
RiCo:你能把該查詢XML執行計畫寄給我分析嗎?
我在課堂上透過實例闡述QO如何改寫查詢,
同時我也提到Order by問題。資料表存在叢集索引,
那麼資料將依叢集索引Key排序,
如查詢使用到非叢集索引,那資料也會依照非叢集索引Key排序,
就算查詢陳述句沒明確使用Order by,而這就是隱式排序。
回到該學員問題,資料表有叢集索引,
查詢也有使用到叢集索引,但資料結果卻沒依照叢集索引Key排序,
該查詢都沒人修改過,但突然這幾天資料排序卻亂了。
我分析完執行計畫後,現在我來簡單重現該學員排序疑問。
(42 個資料列受到影響)
查看執行計畫可以確認查詢使用叢集索引,並且資料依照叢集索引Key(c1)排序。
現在我增加1萬筆資料後再來看看會發生什麼事情。
太Lucky了,我得到了平行查詢計畫,雖然這可以提高大查詢效能。
可以看到這時資料卻沒依照叢集索引Key(c1)排序,
這是因為執行計畫變更為平行執行計畫所導致(因排序需要大量page),
多執行序處理後進行merge基本上不保證資料排序。
如排序資料會造成使用者困擾,那請明確加上Order by,
才不會因執行計畫變更導致結果非預期。