簡體   English   中英

Azure SQL數據庫組未排序

[英]Azure SQL Database Group By not sorting

我一直在Windows Azure SQL數據庫(以前稱為SQL Azure)中使用以下查詢幾年,並且它始終按字段分組。

SELECT CAST(OccurredDate AS DATE) as OccurredDate, COUNT(*) AS [Count], COUNT(DISTINCT CreatedByUserId) AS NumOfUsers 
FROM [TableName] 
GROUP BY CAST(OccurredDate AS DATE)

突然,我今天運行了這個查詢,它不再對結果進行排序。

我認為GROUP BY總是對其工作的列進行排序。

任何見解都非常感謝。

不,GROUP BY不一定排序(雖然這在SQL Server 2000中相對可靠,但它在技術上仍然沒有保證; 2005年對優化器的更改改變了這種行為,因此絕對不能依賴它)。 如果您之前收到特定訂單,這只是巧合。

如果需要可預測的訂單,請添加ORDER BY 期。

在這種情況下,由於ORDER BY是最后處理的,因此您不必重復表達式,只需使用SELECT列表中的別名即可:

ORDER BY OccurredDate;

我想詳細說明亞倫的回應。 這不僅僅是一個“優化器”問題,它還是一個算法問題。

當大多數人想到聚合時,他們會想到以下方法:

  1. 按聚合的字段對數據進行排序(或遍歷鍵的索引)
  2. 瀏覽數據並確定組的起始位置
  3. 使用相同的鍵值聚合所有行的值(由於排序,它們彼此相鄰)
  4. 繼續前進到下一組

運行此算法時,結果是結果是有序的。 這是一些數據庫(如Access和MySQL)提供的唯一算法。

第一點是,即使是這種算法也不能保證在並行(多線程/多服務器)環境中按順序返回數據。 例如,環境的第一步可能是將所有字符串以“A”開頭放在一個處理器(或線程)上,將“B”放在另一個處理器(或線程)上,依此類推。 然后,每個處理器在本地進行聚合。

重要的是,處理器不一定全部同時完成。 例如,“X”可能在“S”之前很久就結束了。 而且,這意味着“X”的結果首先回來了。 瞧,結果不合適。

第二點更重要。 SQL Server(和其他智能數據庫)具有用於進行聚合的其他算法。 上面的算法實際上是一個混合 - 首先是值“散列”,意味着“相似”值在每個處理器上匯集在一起​​,然后其余的按照聚合進行排序。 “散列”保證所有具有相同值的鍵位於同一處理器上。

這也可以用於最終算法。 當您使用基於散列的算法時,結果肯定不是按排序順序排列,因為在處理過程中不會發生排序。 令人高興的是,SQL Server支持聚合和連接的基於散列的算法,因此您不希望對結果進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM