किस क्रम में खंड द्वारा अनुपस्थित ORDER को पंक्तिबद्ध किया जाता है?


11

एक प्रोग्रामर एक ही एप्लिकेशन का परीक्षण और तुलना कर रहा है जो समान डेटाबेस संरचना का उपयोग करता है, और एक ही डेटा, केवल दो अलग-अलग डेटाबेस में, एक ओरेकल 8 के साथ और एक ओरेकल 9 के साथ।

ऐप बिना किसी ORDER BY क्लॉज के एक क्वेरी चलाता है ।

उनका दावा है कि ORDER-BY-less क्वेरी को दोनों डेटाबेस में समान क्रम में पंक्तियों को वापस करना चाहिए।

मैं बताता हूं कि जब तक आप एक आदेश प्रदान नहीं करते हैं तब तक उसी पंक्ति क्रम की कोई वारंटी नहीं है

डेटाबेस में समान अनुक्रमित और कुंजियाँ हैं। लेकिन व्याख्या योजना से पता चलता है कि डेटाबेस में से एक में शामिल तालिकाओं में से एक की कुंजी का उपयोग किया जाता है, जबकि दूसरे डेटाबेस में यह दूसरे का उपयोग कर रहा है।

वह जोर देकर कहते हैं कि दो DB एनवायरमेंट समान नहीं हैं, जो इसलिए है क्योंकि उनके पास अलग-अलग आँकड़े, अलग-अलग rdbms इंजन आदि हैं, लेकिन इसलिए नहीं कि मूल डेटाबेस में हर इंडेक्स को दोहराने में मैं असफल रहा।

मैं उससे कहता हूं कि ORDER BYयदि आदेश वास्तव में महत्वपूर्ण है तो उसे अन्वेषण प्रदान करना चाहिए ।

प्रश्न

इसलिए मैं उसे बेहतर तरीके से समझा सकता हूं:

जब आप अन्वेषण नहीं करते हैं तो क्वेरी किस क्रम में पंक्तियाँ प्रदान करती है, और क्‍वेरी उसी क्रम में पंक्तियों को क्‍यों नहीं लौटाती है?


3
यह अपरिभाषित है। मुझे विश्वास नहीं है कि एसक्यूएल विनिर्देश विशिष्ट आदेश बताता है कि रिकॉर्ड वापस करना है, इसलिए यह कार्यान्वयन पर निर्भर होने वाला है।
रॉबर्ट हार्वे

1
@RobertHarvey यही कारण है कि मैं उसे बताता हूं। वास्तव में: परिभाषाओं के अनुसार संबंधपरक तालिकाओं का कोई विशेष क्रम नहीं होना चाहिए।
ट्यूलेंस कोर्डोवा

1
यह एक अलग सूचकांक का उपयोग करने के लिए सॉफ्टवेयर के सटीक एक ही संस्करण पर भी समझ में आ सकता है क्योंकि यह उस डेटाबेस में सटीक डेटा के लिए इकट्ठा किए गए सूचकांक के आंकड़ों के आधार पर अधिक चयनात्मक हो सकता है। यदि आप इसे निर्दिष्ट नहीं करते हैं तो आप वास्तव में उस आदेश पर भरोसा नहीं कर सकते।
Psr 9'13

आप "सम्मिलित समय" आदेश का पालन करने के लिए unindexed कॉलम द्वारा पहली क्वेरी की वास्तविक उम्मीद कर सकते हैं; अनुक्रमित "अद्यतन समय" द्वारा। लगातार अनुरोधों को कैश्ड परिणामों द्वारा "दागी" होने की संभावना हो सकती है और इसलिए बहुत यादृच्छिक रूप से; फिर भी कभी भी इस पर निर्भर नहीं होता है - यह संस्करण से संस्करण में, मापदंडों द्वारा, अपडेट संचालन द्वारा और पूर्णिमा पर खराब मौसम से बदल सकता है। "अपरिभाषित" सही उत्तर है, और कुछ भी सर्वोत्तम सूचित अनुमानों पर है।
एसएफ।

1
RDMBS-es द्वारा लौटाए गए रिजल्ट सेट केवल वह हैं: सेट , जिसकी परिभाषा में कोई विशेष आदेश नहीं है। इसलिए RDBMS उन्हें पसंद किए गए किसी भी क्रम में वापस कर सकता है और अगली क्वेरी निष्पादन पर फिर से आदेश बदल सकता है। आदेश द्वारा एक विशेष आदेश के आधार पर भरोसा करना एक गलती होगी। मैं हमेशा अपने सहकर्मियों को यह समझाने की कोशिश करता हूं, लेकिन मैं केवल आधा समय ही सफल रहा हूं: डी।
राडू मुरझिया

जवाबों:


25

से विकिपीडिया :

ORDER BY क्लॉज यह पहचानता है कि परिणामी डेटा को सॉर्ट करने के लिए कौन से कॉलम का उपयोग किया जाता है, और किस दिशा में उन्हें सॉर्ट किया जाना चाहिए (विकल्प आरोही या अवरोही हैं)। ORDER BY क्लॉज के बिना, SQL क्वेरी द्वारा दी गई पंक्तियों का क्रम अपरिभाषित है।

तो यह अपरिभाषित है।

SQL विनिर्देश विशिष्ट आदेश को निर्दिष्ट नहीं करता है जिसे रिकॉर्ड वापस करना है, इसलिए यह कार्यान्वयन पर निर्भर होने वाला है।

तालिका में कोई अनुक्रमणिका नहीं होने के साथ, समझदार आदेश वह क्रम होगा जिसमें रिकॉर्ड डाले गए थे। प्राथमिक कुंजी परिभाषित होने के साथ, समझदार आदेश प्राथमिक कुंजी का क्रम होगा। लेकिन चूंकि ANSI युक्ति को एक विशिष्ट आदेश की आवश्यकता नहीं है, यह विक्रेता के ऊपर है, और उनकी संवेदनशीलता आपकी या मेरी से भिन्न हो सकती है।

चूंकि आदेश को विनिर्देश में नहीं कहा गया है, इसलिए किसी विशेष विक्रेता के कार्यान्वयन के व्यवहार पर भरोसा करना नासमझी है, क्योंकि यह एक विक्रेता से दूसरे में भिन्न हो सकता है, और विक्रेता बिना किसी चेतावनी के किसी भी समय आदेश को बदल सकता है।

जैसा कि आपने कहा, ORDER BYयदि आदेश महत्वपूर्ण है, तो केवल खंड शामिल करें ।


क्वेरी में कई सम्मिलित तालिकाएँ हैं। तो एक डीबी इंजन परिणाम को एक मानदंड से अलग करता है और दूसरा डीबी दूसरे मानदंड का उपयोग करता है। Obvioulsy, जब एक ORDER BY क्लॉज प्रदान किया जाता है, दोनों प्रश्न निर्दिष्ट क्रम में पंक्तियों को वापस करते हैं।
ट्यूलेंस कोर्डोवा

+1 AFAICR आदेश को तब भी अनुमति दी जाती है जब आप किसी विशेष डेटाबेस उदाहरण पर किसी भी क्वेरी को निष्पादित करने के लिए हर बार भिन्न हो सकते हैं।
MarkJ

2
मैं कहूँगा कि, बिना आदेश खंड के द्वारा, केवल समझदार परिणाम आदेश है जो कुछ भी कम से कम ओवरहेड बनाता है। साधारण डीबी भंडारण इंजन और प्रश्नों के लिए, जो अक्सर प्रविष्टि क्रम होगा (और उत्पन्न प्राथमिक कुंजी के लिए प्राथमिक कुंजी क्रम के समान)। लेकिन जैसे ही आप हैश में शामिल होते हैं, मुझे उम्मीद है कि आदेश अनिवार्य रूप से यादृच्छिक होगा।
माइकल बोर्गवर्ड

2

स्पष्ट रूप से इंगित करते हुए कि युक्ति यह नहीं कहती है कि डेटा किस क्रम में आता है, काम नहीं किया है। संभवतः क्योंकि वह जानता है कि डेटा एक डिस्क या मेमोरी पर कहीं है और इस तरह एक आदेश के रूप में है। उससे पूछें कि कई तालिकाओं से गणना किए गए डेटा का क्रम क्या है। यानी एक उदाहरण बनाएं जहां आप 4 तालिकाओं से जुड़ते हैं, उनमें से 2 पर गणना करते हैं और केवल गणना किए गए मान को वापस करते हैं।

इंजन उस डेटा को उस क्रम में लौटाता है जिसे वह इसे पाता है (इसके द्वारा एक ऑर्डर अनुपस्थित है), लेकिन यह कैसे पाता है कि यह उन कारकों पर निर्भर करता है जो बदल सकते हैं - सूचकांक, आँकड़े, कैश। आम तौर पर डेटा एक सुसंगत क्रम में होगा - लेकिन यदि आप आदेश पर निर्भर करते हैं, तो आपको इसके लिए पूछना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.