2012-05-02 17 views
7

मैंने हाल ही में जब तक इसे दैनिक उपयोग करना शुरू किया तब तक मैंने शायद ही कभी SQL का उपयोग किया है।एसक्यूएल पंक्ति वापसी आदेश

  1. जब एक तालिका पंक्तियों लौटे का हिस्सा का चयन एक ही क्रम में दिखाई देते हैं के रूप में वे दिखाई देते हैं, तो मैं पूरी तालिका
  2. के आदेश का चयन करें: मुझे लगता है कि यदि कोई "आदेश से" खंड प्रयोग किया जाता है नोटिस एक जॉइन से चयन करके लौटाई गई पंक्तियों को शामिल होने के बाएं अधिकांश सदस्य द्वारा निर्धारित किया जाता है।

क्या यह व्यवहार एक मानक चीज है जो सबसे आम डेटाबेस (माईएसक्ल, ओरेकल, पोस्टग्रेएसक्यूएल, स्क्लाइट, एसक्यूएल सर्वर) में गिन सकता है? (मैं वास्तव में यह भी नहीं जानता कि कोई वास्तव में एसक्लाइट में इस पर भरोसा कर सकता है)। यदि ऐसा है तो इसे कितनी सख्ती से सम्मानित किया जाता है (उदाहरण के लिए यदि कोई "समूह द्वारा" का उपयोग करता है तो क्या प्रत्येक समूह के पास प्रत्येक ऑर्डरिंग होगा)?

उत्तर

11

धारा 20.2 < प्रत्यक्ष चयन बयान: कई पंक्तियों >, उपधारा SQL-92 specification की "सामान्य नियम":

 
4) If an <order by clause> is not specified, then the ordering of 
    the rows of Q is implementation-dependent. 
+0

यह केवल के लिए * कर्सर * मुद्दे को शामिल किया गया है, लेकिन एक ही क्वेरी परिणामों के लिए सच है प्राप्त नहीं एक कर्सर के माध्यम से। – kgrittn

+0

@kgrittn: अपडेट किया गया। – eggyal

13

यदि क्वेरी में कोई आदेश शामिल नहीं है, पंक्तियों का लौटा आदेश अनिर्धारित है।

जबकि कुछ आरडीबीएमएस कुछ स्थितियों में विशिष्ट आदेशों में पंक्तियां वापस कर देंगे, भले ही धारा द्वारा आदेश जारी किया गया हो, ऐसे व्यवहार पर कभी भरोसा नहीं किया जाना चाहिए।

9

आप चाहते हैं, में शामिल एक ORDER BY। आप एक ORDER BY शामिल नहीं हैं, तो आप कह रहे हैं एसक्यूएल सर्वर:

मुझे परवाह नहीं है क्या आपको पंक्तियों को वापस, बस पंक्तियों

जब से तुम परवाह नहीं है वापसी , एसक्यूएल सर्वर यह तय करने जा रहा है कि पंक्तियों को कैसे वापस करना है, यह संभवतः संभवतः सबसे प्रभावी तरीका होगा (या आखिरी बार इस विशिष्ट क्वेरी के लिए योजना कैश की गई थी)। इसलिए आपको जो व्यवहार आप देखते हैं उस पर भरोसा नहीं करना चाहिए। यह डाटा परिवर्तन, सांख्यिकी परिवर्तन, सूचकांक परिवर्तन, सर्विस पैक्स, संचयी अद्यतन, उन्नयन, साथ, अगले करने के लिए क्वेरी में से एक रन से बदल सकते हैं आदि आदि आदि

+0

+1: और समांतरता (और भी, निहितार्थ, समवर्ती भार)। – MatBailie

3
PostgreSQL के लिए

, आप ORDER BY खंड को छोड़ देते हैं, तो डेटाबेस को संशोधित नहीं होने पर आप सटीक वही क्वेरी 100 बार चला सकते हैं, और दूसरों के मुकाबले एक अलग क्रम में बीच में एक रन प्राप्त कर सकते हैं। वास्तव में, प्रत्येक रन एक अलग क्रम में हो सकता है।

ऐसा होने का एक कारण यह है कि यदि योजना में चुना गया है, तो तालिका के ढेर के अनुक्रमिक स्कैन में शामिल है, और उस तालिका में उस तालिका के ढेर के पहले से ही एक सिकस्कैन है, तो आपकी क्वेरी स्कैन शुरू करेगी, जो भी अन्य स्कैन है डिस्क एक्सेस की आवश्यकता को कम करने के लिए पहले से ही।

जैसा कि अन्य उत्तरों ने इंगित किया है, यदि आप किसी निश्चित क्रम में डेटा चाहते हैं, तो उस आदेश को निर्दिष्ट करें। PostgreSQL अनुरोध का आदेश किसी योजना को चुनने पर विचार करेगा, और उस सूचकांक का उपयोग कर सकता है जो उस क्रम में डेटा प्रदान करता है, यदि वह पंक्तियों को किसी अन्य तरीके से प्राप्त करने से सस्ता होने के लिए काम करता है और फिर उन्हें सॉर्ट करता है।

GROUP BY आदेश की कोई गारंटी प्रदान नहीं करता है; PostgreSQL समूह को करने के लिए डेटा को सॉर्ट कर सकता है, या हैश तालिका का उपयोग करें और हैशिंग एल्गोरिदम (यानी, सुंदर यादृच्छिक) द्वारा उत्पन्न संख्या के क्रम में पंक्तियों को वापस कर दें। और यह एक रन से दूसरे तक बदल सकता है।

-1

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

इस के लिए के रूप में:

BY खंड कोई आदेश क्वेरी में शामिल है, तो पंक्तियों की लौटे आदेश अपरिभाषित है।

सख्ती से सही नहीं है - हर आरडीबीएमएस मैं कभी पर काम किया है पर (ओरेकल, इन्फोर्मिक्स, एसक्यूएल सर्वर, DB2 कुछ नाम हैं) एक अलग खंड भी द्वारा के रूप में अनन्य मानों को ढूँढने एक शामिल है एक आदेश जैसा ही होता है परिभाषा के अनुसार क्रमबद्ध करें।

संपादित करें (6/2/14):

एक साधारण तालिका

enter image description here

अलग और आदेश द्वारा बनाएँ, दोनों योजना और लागत में ही है चूंकि यह स्पष्ट रूप से एक ही ऑपरेशन किया जा सकता है

enter image description here

enter image description here

और आश्चर्यजनक रूप से नहीं, प्रभाव इस प्रकार एक ही

enter image description here

+0

PostgreSQL में यह * कभी-कभी * करता है; क्वेरी और आपके अनुकूलक लागत कारकों के बारे में कई विवरणों के आधार पर यह अद्वितीय मूल्यों को खोजने और क्रमबद्ध क्रम में पंक्तियों को वापस करने के लिए एक प्रकार का उपयोग कर सकता है। अन्य बार यह पता चल सकता है कि हैश तालिका तेज हो जाएगी, और अद्वितीय मान उनके हैश मानों के क्रम में होंगे, जब तक कि आपने 'ऑर्डर बाय' क्लॉज निर्दिष्ट नहीं किया हो। मुझे संदेह है कि पोस्टग्रेएसक्यूएल एकमात्र उत्पाद है जो हैश टेबल का उपयोग करने के लिए है, या जब कोई ऑर्डर अनुरोध नहीं किया जाता है तो परिणामों को सबसे तेज़ तरीके से वापस करने के लिए। – kgrittn

+0

SQL सर्वर भी अलग-अलग आइटम निर्धारित करने के लिए हैशिंग का उपयोग कर सकता है। बस इस बात को साबित करता है कि 'ऑर्डर द्वारा' आप * किसी भी 'ऑर्डर' पर भरोसा नहीं कर सकते हैं। –

+0

मैंने कभी नहीं कहा कि यह (या चाहिए) पर भरोसा किया जा सकता है। बस * मान * का उपयोग किए जाने पर परिभाषा द्वारा परिभाषित एक क्रमबद्ध सूची का उत्पादन करेगा। स्पष्ट रूप से एक हैश विभिन्न प्रकार के परिणाम उत्पन्न करेगा। –

संबंधित मुद्दे