2010-09-21 11 views
8

शायद कोई मुझे यह समझा सकता है, लेकिन ओरेकल से डेटा टेबल से पूछताछ करते समय, जहां एक कुंजी के लिए एकाधिक रिकॉर्ड मौजूद होते हैं (ग्राहक आईडी कहें) उस ग्राहक के लिए पहले जो रिकॉर्ड दिखाई देता है, वह भिन्न हो सकता है यदि लेनदेन प्रकार जैसे वैकल्पिक क्षेत्र के अनुसार आदेश लागू करने के लिए कोई आदेश "आदेश द्वारा" कथन नहीं है। तो एक ही टेबल पर एक ही क्वेरी चलाने से 10 मिनट पहले की तुलना में एक अलग रिकॉर्ड ऑर्डरिंग मिल सकती है।ओरेकल एसक्यूएल मनमाने ढंग से फैशन में पंक्तियों को वापस करता है जब कोई "ऑर्डर बाय" क्लॉज का उपयोग नहीं किया जाता है

जैसे, एक रन उत्पन्न हो सकते हैं:

Cust_ID, TRANSACTION_TYPE
123 एक
123 बी

जब तक एक "आदेश TRANSACTION_TYPE द्वारा" खंड प्रयोग किया जाता है, ओरेकल मनमाने ढंग से निम्न परिणाम अगले लौट सकते हैं समय क्वेरी चलाया जाता है:

Cust_ID, TRANSACTION_TYPE
123 बी
123 एक

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

क्या इसे अनुकूलक के साथ क्या करना है और यह कैसे निर्णय लेता है कि डेटा को सबसे कुशलतापूर्वक पुनर्प्राप्त करने के लिए कहां से किया जाए?

बेशक प्रोग्रामिंग परिप्रेक्ष्य से सबसे अच्छा अभ्यास जो भी आदेश आवश्यक है, को मजबूर करना है, मैं इस व्यवहार से थोड़ा परेशान था।

+0

मैं पता नहीं क्यों, लेकिन यह एक बहुत ही अजीब अवलोकन और विशेष रूप से 'हतोत्साहित' यह का हिस्सा है। :) –

+0

आप * ऑर्डरिंग को मजबूर नहीं कर रहे हैं, आप * इसे * चुन रहे हैं। – egrunin

उत्तर

8

कोई डिफ़ॉल्ट ऑर्डरिंग नहीं है। यदि आप ORDER BY निर्दिष्ट नहीं करते हैं, तो आप पहले 10000 बार समान परिणाम प्राप्त कर सकते हैं, फिर यह बदल सकता है।

ध्यान दें कि यह समान मूल्यों के लिए ORDER BY के साथ भी सत्य है। उदाहरण के लिए:

Col1 Col2 
1 1 
2 1 
3 2 
4 2 

आप ORDER BY Col2 उपयोग करते हैं, तो आप अभी भी अगर पंक्ति 1 या 2 पहले आ जाएगा पता नहीं है।

22

पंक्तियों का क्रम एक SELECT बयान से आवेदन करने के लिए लौट पूर्णतः ऐच्छिक जब तक अन्यथा निर्दिष्ट है। यदि आप एक निश्चित क्रम में पंक्तियों को वापस करने की आवश्यकता है, तो चाहते हैं, या उम्मीद करते हैं, तो यह आदेश देने के लिए उपयोगकर्ता की ज़िम्मेदारी है।

(चेतावनी:। इस तरह के DISTINCT, UNION, MINUS, INTERSECT, या GROUP BY के रूप में ओरेकल के कुछ संस्करणों, परोक्ष आरोही क्रम में डेटा को सॉर्ट होगा निश्चित संचालनों के लिए इस्तेमाल किया गया है, तो हालांकि, के रूप ओरेकल हैश छँटाई लागू किया गया है, डेटा की तरह की प्रकृति भिन्न हो सकते हैं , और उस सुविधा पर निर्भर एसक्यूएल के बहुत सारे टूट गए।)

+6

+1 –

+1

मैं लगभग इच्छा कभी कभी संगठन खंड आवश्यक था, ताकि लोगों को Oracle में डिफ़ॉल्ट रूप से एहसास होता है कि (या अधिक सही, उस सुविधा पर निर्भर एसक्यूएल के बहुत सारे * के रूप में हो रही है हमेशा टूट गया * संपर्क में आते थे), टेबल heap- हैं का आयोजन किया। –

+1

+1 - लेकिन इस की आवश्यकता होगी कि जो लोग साल के लिए ओरेकल का इस्तेमाल किया है (स्वयं शामिल है) को समझने के लिए के संगठन खंड टेबल साधन बनाएं होता (और धन्यवाद, अपनी टिप्पणी इस बारे में पढ़ें जाना मुझे संकेत दिया जाए)। –

5

सरल जवाब यह है कि एसक्यूएल मानक कहता है कि उन प्रश्नों के लिए कोई डिफ़ॉल्ट आदेश नहीं है जिनके पास ऑर्डर द्वारा ऑर्डर नहीं है, इसलिए आपको कभी भी एक नहीं मानना ​​चाहिए।

असली कारण शायद प्रत्येक पंक्ति को सौंपा गया हैश से संबंधित है क्योंकि इसे रिकॉर्ड सेट में खींचा जाता है। लगातार हैशिंग मानने का कोई कारण नहीं है।

6

बस टोकरी में गेंदों की तरह एक टेबल में पंक्तियों को चित्रित करें। क्या गेंदों का ऑर्डर है?

मुझे नहीं लगता कि कोई भी डीबीएमएस है जो गारंटी देता है यदि ORDER BY निर्दिष्ट नहीं है।

कुछ हमेशा पंक्तियों को क्रम में वापस क्रम में वापस कर सकते हैं, लेकिन यह एक कार्यान्वयन दुष्प्रभाव है।

कुछ निष्पादन योजना परिणामस्वरूप ऑर्डर के बिना भी ऑर्डर करने का आदेश दिया जा सकता है, लेकिन फिर यह एक कार्यान्वयन दुष्प्रभाव है जिस पर आपको भरोसा नहीं करना चाहिए।

6

यदि कोई ऑर्डर द्वारा खंड मौजूद नहीं है (न केवल ओरेकल - कोई संबंधपरक डेटाबेस) पंक्तियों को वापस करने के लिए स्वतंत्र है, जो उन्हें खोजने के लिए होता है। यह अनुकूलक द्वारा चुने गए क्वेरी प्लान के आधार पर अलग-अलग होगा।

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

इसके अतिरिक्त, डेटाबेस उत्पाद के अपडेट क्वेरी के व्यवहार को बदल सकते हैं। पिछले साल एक बड़ा संस्करण अपग्रेड करते समय हमें थोड़ा सा घबराहट करना पड़ा जब हमने पाया कि ओरेकल 10 ने ओरेकल 9 के मुकाबले ग्रुप बाय परिणाम को एक अलग क्रम में वापस कर दिया था। कारण - खंड द्वारा कोई आदेश नहीं।

ऑर्डर द्वारा - जब लौटाए गए डेटा का क्रम वास्तव में मायने रखता है।

+0

वाह, समूह द्वारा क्रमशः आदेश का संकेत नहीं देता है। धन्यवाद, मुझे यह याद रखना होगा। यह एक और उदाहरण है जहां एसएएस एसक्यूएल (जिसे प्रो एसक्यूएल कहा जाता है) ओरेकल एसक्यूएल से अलग है। प्रक्रिया एसक्यूएल वास्तव में एक आदेश को अनदेखा कर देगा जब खंड द्वारा एक समूह मौजूद है। – jgunnink

2

यदि आप ORDER BY का उपयोग नहीं करते हैं, तो आदेश मनमाने ढंग से है; हालांकि, भौतिक भंडारण और स्मृति पहलुओं पर निर्भर है। इसलिए, यदि आप 10 मिनट में सैकड़ों बार एक ही क्वेरी दोहराते हैं, तो आपको हर बार लगभग एक ही ऑर्डर मिल जाएगा, क्योंकि शायद कुछ भी नहीं बदलेगा।

चीज़ें है कि "noorder आदेश" को बदल सकता है कर रहे हैं:

  • को क्रियान्वित करने की योजना - अगर बदल गया है
  • आवेषण (आप कि इशारा किया है) और क्वेरी में शामिल टेबल पर हटा देता है।
  • पंक्तियों की याद में उपस्थिति की तरह अन्य बातों के। (अन्य टेबल पर अन्य querys को प्रभावित कर सकता है कि)
+0

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

0

जब आप समानांतर डेटा पुनर्प्राप्ति मैं में मिल/ओ नहीं यह संभव विभिन्न पर विभिन्न दृश्यों प्राप्त करने के लिए है संग्रहीत डेटा में कोई बदलाव के साथ भी चलता है?

यह एक मल्टीप्रोसेसिंग वातावरण में समानांतर धागे को पूरा करने का क्रम अनिर्धारित है और एक ही साझा प्रोसेसर पर और क्या हो रहा है इसके साथ भिन्नता हो सकती है।

+0

मुझे नहीं लगता कि यह सुझाव देने के लिए कुछ भी है कि समांतर डेटा पुनर्प्राप्ति यहां शामिल है। –

0

जैसा कि मैं ओरेकल डेटाबेस इंजन के लिए नया हूं, मैंने अपने व्यवहार को SELECT कथन में देखा है जिसमें ORDER BY नहीं है।

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

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

ORDER BY गंभीर प्रदर्शन ओवरहेड का कारण बन सकता है, यही कारण है कि आप इसका उपयोग नहीं करना चाहते हैं जब तक कि आप असंगत परिणाम आदेश से खुश न हों।

मैं एक निष्कर्ष के साथ समाप्त हुआ कि मेरे सभी ओरेकल प्रश्नों में मुझे ORDER BY का उपयोग करना होगा या मैं अप्रत्याशित आदेश के साथ समाप्त हो जाऊंगा जो मेरी अंतिम उपयोगकर्ता रिपोर्ट को बहुत प्रभावित करेगा।

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