[英]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;
我想詳細說明亞倫的回應。 這不僅僅是一個“優化器”問題,它還是一個算法問題。
當大多數人想到聚合時,他們會想到以下方法:
運行此算法時,結果是結果是有序的。 這是一些數據庫(如Access和MySQL)提供的唯一算法。
第一點是,即使是這種算法也不能保證在並行(多線程/多服務器)環境中按順序返回數據。 例如,環境的第一步可能是將所有字符串以“A”開頭放在一個處理器(或線程)上,將“B”放在另一個處理器(或線程)上,依此類推。 然后,每個處理器在本地進行聚合。
重要的是,處理器不一定全部同時完成。 例如,“X”可能在“S”之前很久就結束了。 而且,這意味着“X”的結果首先回來了。 瞧,結果不合適。
第二點更重要。 SQL Server(和其他智能數據庫)具有用於進行聚合的其他算法。 上面的算法實際上是一個混合 - 首先是值“散列”,意味着“相似”值在每個處理器上匯集在一起,然后其余的按照聚合進行排序。 “散列”保證所有具有相同值的鍵位於同一處理器上。
這也可以用於最終算法。 當您使用基於散列的算法時,結果肯定不是按排序順序排列,因為在處理過程中不會發生排序。 令人高興的是,SQL Server支持聚合和連接的基於散列的算法,因此您不希望對結果進行排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.