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

चयन क्वेरी में डिफ़ॉल्ट पंक्ति क्रम - SQL सर्वर 2008 बनाम SQL 2012

आपको वापस जाना होगा और ORDER BY जोड़ना होगा आपके कोड के लिए क्लॉज क्योंकि उनके बिना ऑर्डर की गारंटी कभी नहीं होती है। आप अतीत में "भाग्यशाली" थे कि आपको हमेशा एक ही ऑर्डर मिलता था लेकिन ऐसा इसलिए नहीं था क्योंकि SQL Server 2008 ने वैसे भी इसकी गारंटी दी थी। यह सबसे अधिक संभावना है कि आपकी अनुक्रमणिका या डिस्क पर डेटा कैसे संग्रहीत किया जा रहा था।

यदि आप अपग्रेड करते समय किसी नए होस्ट में चले जाते हैं तो अकेले हार्डवेयर कॉन्फ़िगरेशन में अंतर आपके प्रश्नों के निष्पादन के तरीके को बदल सकता है। इस तथ्य का उल्लेख नहीं करने के लिए कि नए सर्वर ने तालिकाओं पर आँकड़ों की पुनर्गणना की होगी और SQL Server 2012 क्वेरी ऑप्टिमाइज़र शायद SQL Server 2008 की तुलना में चीजों को थोड़ा अलग तरीके से करता है।

यह एक भ्रम है कि आप जिस क्रम में चाहते हैं, उसे स्पष्ट रूप से बताए बिना आप SQL में सेट किए गए परिणाम के क्रम पर भरोसा कर सकते हैं। SQL परिणाम कभी नहीं एक ऑर्डर है जिस पर आप ORDER BY . का उपयोग किए बिना भरोसा कर सकते हैं खंड। एसक्यूएल सेट थ्योरी के आसपास बनाया गया है। क्वेरी परिणाम मूल रूप से सेट (या बहु-सेट) होते हैं।

इट्ज़िक बेन-गण ने अपनी पुस्तक Microsoft SQL Server 2012 T-SQL Fundamentals

में SQL के संबंध में सेट थ्योरी का अच्छा विवरण दिया है। <ब्लॉकक्वॉट>

सेट थ्योरी, जिसकी उत्पत्ति गणितज्ञ जॉर्ज कैंटर से हुई, गणितीय शाखाओं में से एक है जिस पर रिलेशनल मॉडल आधारित है। कैंटर की एक सेट की परिभाषा इस प्रकार है:

एक "सेट" से हमारा मतलब किसी भी संग्रह एम से हमारी धारणा या हमारे विचार के निश्चित, विशिष्ट वस्तुओं एम (जिन्हें एम के "तत्व" कहा जाता है) में होता है। - जोसेफ डब्ल्यू. ड्यूबेन और जॉर्ज कैंटर (प्रिंसटन यूनिवर्सिटी प्रेस, 1990)

इत्ज़िक की परिभाषा में शर्तों की पूरी तरह से व्याख्या करने के बाद आगे कहते हैं:

<ब्लॉकक्वॉट>

कैंटर की एक सेट की परिभाषा क्या छोड़ती है शायद उतनी ही महत्वपूर्ण है जितनी इसमें शामिल है। ध्यान दें कि परिभाषा सेट तत्वों के बीच किसी भी क्रम का उल्लेख नहीं करती है। जिस क्रम में सेट तत्वों को सूचीबद्ध किया गया है वह महत्वपूर्ण नहीं है। सूची तत्वों को सूचीबद्ध करने के लिए औपचारिक संकेतन घुंघराले कोष्ठक का उपयोग करता है:{a, b, c}। क्योंकि आदेश की कोई प्रासंगिकता नहीं है, आप उसी सेट को {b, a, c} या {b, c, a} के रूप में व्यक्त कर सकते हैं। एट्रीब्यूट्स (एसक्यूएल में कॉलम कहा जाता है) के आगे कूदते हुए, जो कि एरिलेशन का हेडर बनाते हैं (एसक्यूएल में एक टेबल कहा जाता है), एक तत्व को नाम से पहचाना जाना चाहिए - क्रमिक स्थिति नहीं। इसी तरह, टुपल्स के सेट पर विचार करें (एसक्यूएल द्वारा पंक्तियाँ कहा जाता है) जो संबंध के शरीर को बनाते हैं; एक तत्व की पहचान उसके प्रमुख मूल्यों से होती है - स्थिति से नहीं। कई प्रोग्रामर्स को इस विचार के अनुकूल होने में कठिनाई होती है कि क्वेरी टेबल के संबंध में, पंक्तियों के बीच कोई क्रम नहीं है। दूसरे शब्दों में, किसी तालिका के विरुद्ध क्वेरी किसी भी क्रम में पंक्तियों को वापस कर सकती है जब तक आप स्पष्ट रूप से अनुरोध नहीं करते हैं कि डेटा को एक विशिष्ट तरीके से क्रमबद्ध किया जाए, शायद प्रस्तुति के उद्देश्यों के लिए।

लेकिन एक सेट की अकादमिक परिभाषा की परवाह किए बिना SQL सर्वर में भी कार्यान्वयन ने परिणामों में किसी भी क्रम की गारंटी नहीं दी है। क्वेरी ऑप्टिमाइज़र टीम के एक सदस्य द्वारा 2005 से MSDN ब्लॉग पोस्ट में कहा गया है कि आपको मध्यवर्ती संचालन के आदेश पर बिल्कुल भी भरोसा नहीं करना चाहिए।

<ब्लॉकक्वॉट>

पुन:क्रमित नियम इस धारणा का उल्लंघन कर सकते हैं और करेंगे (और ऐसा तब करें जब यह आपके लिए असुविधाजनक हो, डेवलपर;)। कृपया समझें कि जब हम एक अधिक कुशल योजना खोजने के लिए संचालन को पुन:व्यवस्थित करते हैं, तो हम पेड़ में मध्यवर्ती नोड्स के लिए आदेश देने के व्यवहार को बदल सकते हैं। यदि आपने ट्री में कोई ऑपरेशन रखा है जो विशिष्ट मध्यवर्ती क्रम को मानता है, तो वह टूट सकता है।

कॉनर कनिंघम (आर्किटेक्ट, एसक्यूएल सर्वर कोर इंजन) द्वारा यह ब्लॉग पोस्ट "नो सीटबेल्ट - ऑर्डर के बिना ऑर्डर की अपेक्षा" SQL सर्वर 2008 के बारे में है। उसके पास 20k पंक्तियों वाली एक तालिका है जिसमें एक इंडेक्स है जो हमेशा पंक्तियों को वापस करने के लिए प्रतीत होता है एक ही आदेश। ORDER BY . जोड़ना क्वेरी के लिए निष्पादन योजना को भी नहीं बदलता है, इसलिए यदि ऑप्टिमाइज़र को इसकी आवश्यकता नहीं है, तो यह क्वेरी को और अधिक महंगा बनाने जैसा नहीं है। लेकिन एक बार जब वह तालिका में एक और 20k पंक्तियाँ जोड़ता है तो अचानक क्वेरी योजना बदल जाती है और अब यह समांतरता का उपयोग करती है और परिणाम अब आदेशित नहीं होते हैं!

<ब्लॉकक्वॉट>

यहां कठिन हिस्सा यह है कि किसी बाहरी उपयोगकर्ता के लिए यह जानने का कोई उचित तरीका नहीं है कि कोई योजना कब बदलेगी। सभी योजनाओं का स्थान बहुत बड़ा है और विचार करने के लिए आपके सिर में दर्द होता है। SQL सर्वर का ऑप्टिमाइज़र सरल प्रश्नों के लिए भी योजना बदल देगा, यदि पर्याप्त पैरामीटर बदल जाते हैं। आप भाग्यशाली हो सकते हैं और योजना में बदलाव नहीं कर सकते हैं, या आप इस समस्या के बारे में नहीं सोच सकते हैं और ORDER BY जोड़ सकते हैं।

यदि आपको और अधिक आश्वस्त करने की आवश्यकता है तो बस इन पोस्टों को पढ़ें:

  • ORDER BY के बिना, कोई डिफ़ॉल्ट सॉर्ट क्रम नहीं है। - अलेक्जेंडर कुज़नेत्सोव
  • अदालत में आदेश! - थॉमस कायटे
  • एसक्यूएल में परिणाम सेट का क्रम - टिमोथी वाइसमैन



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TAN () SQL सर्वर में उदाहरण

  2. SQL सर्वर 2012/2014 में छिपे हुए प्रदर्शन और प्रबंधनीयता में सुधार

  3. SQL सर्वर के लिए I/O प्रदर्शन का विश्लेषण

  4. SQL सर्वर varbinary को स्ट्रिंग में परिवर्तित कर रहा है

  5. एकाधिक तालिकाओं, स्तंभों में SQL Server 2008 में पूर्ण-पाठ खोज का उपयोग करना