Sql-Server

完全可重現的選擇語句預設排序問題

  • June 24, 2010

我最近一直在追查客戶數據庫的問題…找到了解決方案,但無法重新創建。

本質上,我們正​​在做一個

Select * from mytable where ArbitraryColumn = 75

其中 MyTable 有一個名為“MyIndentityColumn”的標識列 - 在每個插入中遞增一。自然,通常我會假設返回的順序將是它們被插入的順序(錯誤的假設,但是通過繼承的應用程序強加給我的順序 - 已被修補)。

本質上,我想了解為什麼數據庫在還原到我的本地電腦(相同的作業系統,相同的 SQL 伺服器版本 - 200 sp3)時,使用相同的排序規則,以及在其上還原的相同備份實例,作為客戶端站點上的測試數據庫。

當我執行上述選擇時,我按插入順序獲取它們(即標識列升序排列)。在客戶端,它似乎是隨機的(但每次都是相同的“隨機”順序)……

其他幾點:

  1. 我的測試伺服器上的排序規則與客戶端相同
  2. 相同的數據庫備份恢復到只有我可以訪問的測試
  3. 相同的 SQL Server 版本和服務包
  4. 相同的作業系統
  5. 測試數據庫是一個新的數據庫 - 新的日誌和 MDF…

我通過添加明確的 order by 子句“解決”了問題,但我想了解問題的原因,因為我嘗試重新創建它的確切性質是徒勞的,並且可以在客戶端伺服器上完全重新創建……

提前致謝,

戴夫

記錄集的排序由最外層的 ORDER BY 確定。

為免生疑問:沒有預設排序順序

您提到的“可重現”順序僅反映了 SQL Server 在當時為**您的伺服器讀取執行計劃中數據的方式。相同的服務包?同一個版本?相同數量的 CPU(包括 HT)?完全相同的 SET 選項?

如果計劃發生變化,順序可能也會發生變化。它與插入順序或索引順序或磁碟位置順序無關。

這個問題屬於 StackOverflow,之前已經回答過:

來自 MSDN,使用 ORDER BY 對行進行排序

ORDER BY 保證僅對查詢的最外層 SELECT 語句的排序結果。例如,考慮以下視圖定義

來自康納的部落格

SQL Server 查詢優化器是否在計劃選擇中考慮索引碎片?

不,它不直接關心。

引用自:https://serverfault.com/questions/144110