所以我試圖解釋有些人爲什麼這個查詢是一個壞主意:在SQL Server中,在具有聚簇索引的表上使用時,默認爲TOP確定性?
SELECT z.ReportDate, z.Zipcode, SUM(z.Sales) AS Sales,
COALESCE(
(SELECT TOP (1) GroupName
FROM dbo.zipGroups
WHERE (Zipcode = z.Zipcode)), 'Unknown') AS GroupName,
COALESCE(
(SELECT TOP (1) GroupCode
FROM dbo.zipGroups
WHERE (Zipcode = z.Zipcode)), 0) AS GroupNumber
FROM dbo.Report_ByZipcode AS z
GROUP BY z.ReportDate, z.Zipcode
,並提出一個更好的方式來寫它,當我的老闆結束了,「好了,它已經返回討論對於去年的正確數據,我們沒有任何問題,所以沒關係。「
在哪一刻我想到了自己,在這個世界上,甚至有可能如何?
一些挖後,我發現了這些事實:
- 此查詢通過郵政編碼和日期應該組銷售,並鏈接那些最大的羣體(按人口規模),一個郵政編碼被分配到zipGroups表的方式。
- 每個Zipcode可以分配給0到多個組,並且如果一個Zipcode分配給0個組,它就不在zipGroups表中。
- 集團是一個地理區域,集團數量按人口按照最大到最小排列(例如,覆蓋NY-NJ-CT三州地區的組是GroupNumber 1,內布拉斯加州North Platte是GroupNumber 209 )。
- zipGroups表格在至少2年內沒有變化。
- zipGroups表具有帶Zipcode,GroupNumber(升序)作爲鍵的聚集索引。
- Zipcode,GroupNumber的組合在zipGroups中是唯一的。
所以我的問題有2個部分。
A)即使這些SELECT TOP查詢中沒有ORDER BY子句,它們是否確實是確定性的,因爲聚集索引基本上是爲其提供默認的ORDER BY? B1)如果這是真的,那麼查詢然而不穩定,實際上是在做它應該做的事情嗎? B2)如果不是這樣,你能幫我證明一下嗎?
注:我已經重寫了這個使用連接,所以我不需要SQL來解決它,我需要把它投入生產,所以我不再擔心它打破。
簡單而簡單:如果沒有'ORDER BY',任何訂單都不能保證** –
棘手的問題:對老闆說「這很好」該怎麼說。 –
即使從實際的角度來看,查詢優化器目前不會做任何其他事情,但它在邏輯上並不確定。如果你需要一個特定的行爲,你應該指定它,否則下一個服務包/版本你的查詢可能會中斷(在視圖中使用'TOP 100 PERCENT'或者使用變量來連接字符串。這看起來毫無意義的風險,因爲沒有明顯的好處。 –