2009-05-05 12 views
15

आप सभी डीबीए के लिए एक बुनियादी सरल सवाल।प्राथमिक कुंजी द्वारा हमेशा 'चयन करें' ऑर्डर करता है?

जब मैं कोई चयन करता हूं, तो क्या यह हमेशा गारंटी देता है कि मेरा परिणाम प्राथमिक कुंजी द्वारा आदेश दिया जाएगा, या मुझे इसे 'ऑर्डर बाय' के साथ निर्दिष्ट करना चाहिए?

मैं ओरेकल का उपयोग अपने डीबी के रूप में कर रहा हूं।

उत्तर

41

नहीं, यदि आप "आदेश" का उपयोग नहीं करते हैं तो आपको किसी ऑर्डरिंग की गारंटी नहीं है। वास्तव में, आपको गारंटी नहीं है कि एक प्रश्न से अगली तक ऑर्डर करना वही होगा। याद रखें कि एसक्यूएल एक सेट आधारित फैशन में डेटा से निपट रहा है। अब, एक डेटाबेस कार्यान्वयन या कोई अन्य तरीकों से आदेश प्रदान करने के लिए हो सकता है लेकिन आपको उस पर भरोसा नहीं करना चाहिए।

+1

क्लस्टर इंडेक्स के क्रम में रिकॉर्ड वापस लौटाए जाने का कोई मौका? –

+1

एक बहुत अच्छा मौका, लेकिन गारंटी नहीं है। शामिल प्रश्न, विचार, उप प्रश्न, और जैसे जटिल प्रश्नों में परिणाम सेट को बहुत अलग तरीके से छोड़ दिया जा सकता है। –

+0

एएनडी कभी-कभी क्लस्टर किए गए इंडेक्स ऑर्डर में कभी-कभी वापस आ सकता है और कभी-कभी नहीं। यदि आप एक विशिष्ट आदेश चाहते हैं तो हमेशा एक ऑर्डर का उपयोग करें। – HLGEM

6

जब मैं कोई चयन करता हूं, तो क्या यह हमेशा गारंटी देता है कि मेरा परिणाम प्राथमिक कुंजी द्वारा आदेश दिया जाएगा, या मुझे इसे 'ऑर्डर बाय' के साथ निर्दिष्ट करना चाहिए?

नहीं, यह अब तक गारंटी नहीं है।

SELECT * 
FROM table 

शायद TABLE SCAN का उपयोग करेगा जो प्राथमिक कुंजी का उपयोग नहीं करता है।

आप एक संकेत का उपयोग कर सकते हैं:

SELECT /*+ INDEX(pk_index_name) */ 
     * 
FROM table 

, लेकिन फिर भी इस मामले में आदेश देने की गारंटी नहीं है: यदि आप Enterprise Edition का उपयोग करें, क्वेरी parallelized किया जा सकता है।

SELECT (
     SELECT column 
     FROM table 
     WHERE rownum = 1 
     ORDER BY 
       other_column 
     ) 
FROM other_table 
+0

कोई समस्या नहीं है: तालिका से DISTINCT FIRST_VALUE (कॉलम) चुनें (अन्य_column द्वारा आदेश); –

+0

@ जेफरी: यह संभव है, लेकिन सबक्वायरी सभी FIRST_VALUE का चयन करेगा और उन्हें अद्वितीय बनाएं। इससे सभी प्रदर्शनों को मार दिया जाएगा, यह सबक्वेरी बहुत सारी पंक्तियां देता है। – Quassnoi

0

यह अपने डीबी पर निर्भर करता है और यह भी यह अनुक्रमित क्षेत्रों पर निर्भर करता है: के बाद से ORDER BY एक SELECT खंड सबक्वेरी में इस्तेमाल नहीं किया जा सकता है और आप कुछ इस तरह नहीं लिख सकते हैं

यह एक समस्या है।

उदाहरण के लिए, मेरी तालिका में उपयोगकर्ता प्रत्येक उपयोगकर्ता के पास अद्वितीय वर्चर (20) फ़ील्ड - लॉगिन, और प्राथमिक कुंजी - आईडी है।

और "उपयोगकर्ताओं से * चुनें" लॉगिन द्वारा आदेश दिया गया रोसेट देता है।

0

यदि आप विशिष्ट ऑर्डरिंग चाहते हैं तो इसे विशेष रूप से ORDER BY का उपयोग करके घोषित करें।

क्या होगा यदि तालिका में प्राथमिक कुंजी नहीं है?

+0

यदि तालिका में प्राथमिक कुंजी नहीं है, तो आपके पास डेटा की वापसी के क्रम में अन्य समस्याएं हैं। –

+0

पूरी तरह से, लेकिन यह लोगों को बुरी तरह से टेबल डिजाइन करने से नहीं रोकता है! – pmcilreavy

0

आप एक विशेष क्रम में अपने परिणाम है, हमेशा से

2

नहीं, आदेश कभी नहीं की गारंटी है जब तक आप एक ORDER BY का उपयोग क्रम निर्दिष्ट चाहते हैं।

पंक्तियों को प्राप्त करने का क्रम एक्सेस विधि (जैसे पूर्ण तालिका स्कैन, इंडेक्स स्कैन), तालिका के भौतिक गुण, तालिका के भीतर प्रत्येक पंक्ति का तार्किक स्थान, और अन्य कारकों पर निर्भर है। यदि आप अपनी क्वेरी नहीं बदलते हैं, तो ये सभी बदल सकते हैं, इसलिए आपके परिणाम सेट में लगातार ऑर्डर करने की गारंटी के लिए, ऑर्डर बी आवश्यक है।

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