完全可重現的選擇語句預設排序問題
我最近一直在追查客戶數據庫的問題…找到了解決方案,但無法重新創建。
本質上,我們正在做一個
Select * from mytable where ArbitraryColumn = 75
其中 MyTable 有一個名為“MyIndentityColumn”的標識列 - 在每個插入中遞增一。自然,通常我會假設返回的順序將是它們被插入的順序(錯誤的假設,但是通過繼承的應用程序強加給我的順序 - 已被修補)。
本質上,我想了解為什麼數據庫在還原到我的本地電腦(相同的作業系統,相同的 SQL 伺服器版本 - 200 sp3)時,使用相同的排序規則,以及在其上還原的相同備份實例,作為客戶端站點上的測試數據庫。
當我執行上述選擇時,我按插入順序獲取它們(即標識列升序排列)。在客戶端,它似乎是隨機的(但每次都是相同的“隨機”順序)……
其他幾點:
- 我的測試伺服器上的排序規則與客戶端相同
- 相同的數據庫備份恢復到只有我可以訪問的測試
- 相同的 SQL Server 版本和服務包
- 相同的作業系統
- 測試數據庫是一個新的數據庫 - 新的日誌和 MDF…
我通過添加明確的 order by 子句“解決”了問題,但我想了解問題的原因,因為我嘗試重新創建它的確切性質是徒勞的,並且可以在客戶端伺服器上完全重新創建……
提前致謝,
戴夫
記錄集的排序僅由最外層的 ORDER BY 確定。
為免生疑問:沒有預設排序順序
您提到的“可重現”順序僅反映了 SQL Server 在當時為**您的伺服器讀取執行計劃中數據的方式。相同的服務包?同一個版本?相同數量的 CPU(包括 HT)?完全相同的 SET 選項?
如果計劃發生變化,順序可能也會發生變化。它與插入順序或索引順序或磁碟位置順序無關。
這個問題屬於 StackOverflow,之前已經回答過:
- https://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort-order
- https://stackoverflow.com/questions/1707506/are-the-results-deterministic-if-i-partition-sql-select-query-without-order-by
- 等等
來自 MSDN,使用 ORDER BY 對行進行排序
ORDER BY 保證僅對查詢的最外層 SELECT 語句的排序結果。例如,考慮以下視圖定義
來自康納的部落格,
SQL Server 查詢優化器是否在計劃選擇中考慮索引碎片?
不,它不直接關心。