Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

ग्रुप बाय का उपयोग करते समय SQL Server 2008 ऑर्डर क्यों करता है और कोई ऑर्डर निर्दिष्ट नहीं किया गया है?

इस प्रश्न का उत्तर देने के लिए, दोनों द्वारा निर्मित क्वेरी योजनाओं को देखें।

पहला चयन एक साधारण टेबल स्कैन है, जिसका अर्थ है कि यह आवंटन क्रम में पंक्तियों का उत्पादन करता है। चूंकि यह एक नई तालिका है, यह आपके द्वारा रिकॉर्ड किए गए क्रम से मेल खाती है।

दूसरा SELECT एक GROUP BY जोड़ता है, जिसे SQL सर्वर एक अलग प्रकार के माध्यम से लागू करता है क्योंकि अनुमानित पंक्ति गणना इतनी कम है। यदि आपके पास अधिक पंक्तियां हों या अपने चयन में कुल जोड़ें, तो यह ऑपरेटर बदल सकता है।

उदाहरण के लिए, कोशिश करें:

CREATE TABLE #Values ( FieldValue varchar(50) )

;WITH FieldValues AS
(
    SELECT '4' FieldValue UNION ALL
    SELECT '3' FieldValue UNION ALL
    SELECT '2' FieldValue UNION ALL
    SELECT '1' FieldValue
)
INSERT INTO #Values ( FieldValue )
SELECT
    A.FieldValue
FROM FieldValues A
CROSS JOIN FieldValues B
CROSS JOIN FieldValues C
CROSS JOIN FieldValues D
CROSS JOIN FieldValues E
CROSS JOIN FieldValues F

SELECT
    FieldValue
FROM #Values
GROUP BY
    FieldValue

DROP TABLE #Values

पंक्तियों की संख्या के कारण, यह हैश एग्रीगेट में बदल जाता है, और अब क्वेरी प्लान में कोई सॉर्ट नहीं है।

ORDER BY के बिना, SQL सर्वर किसी भी क्रम में परिणाम लौटा सकता है, और जिस क्रम में वह वापस आता है वह इस बात का एक साइड-इफ़ेक्ट है कि यह कैसे सोचता है कि यह डेटा को सबसे तेज़ी से वापस कर सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्कीमा को नहीं छोड़ा जा सकता, क्योंकि यह मौजूद नहीं है या आपके पास अनुमति नहीं है। - SQL सर्वर / TSQL ट्यूटोरियल भाग 29

  2. LINQ क्वेरी में दो तिथियों के बीच आने वाली तिथि सीमा

  3. मैं संग्रहीत कार्यविधि से डेटाटेबल में तालिका कैसे प्राप्त कर सकता हूं?

  4. Azure कैसे हल करें Windows लॉगिन SQL सर्वर के इस संस्करण में समर्थित नहीं हैं?

  5. CTE में अनंत लूप जब स्व-संदर्भ तालिका को पार्स करते हैं