2009-11-24 20 views
25

से SQL सर्वर का सबसे अच्छा अभ्यास मैंने पढ़ा है, ऐसा लगता है कि डेवलपर का मानना ​​है कि डिफ़ॉल्ट सॉर्ट ऑर्डर हमेशा होता है। उदाहरण के लिए जब एक HTML चयन सूची बनाते हैं तो वे ORDER BY खंड जारी किए बिना SELECT id, name FROM table पर होंगे।डिफ़ॉल्ट सॉर्ट ऑर्डर

अपने अनुभव से यह एफबीओओ का उपयोग करते हुए डीबीएमएस हमेशा ऑर्डर डेटा की तरह लगता है अगर ORDER BY खंड दिया गया है और कोई अनुक्रमणिका नहीं है। हालांकि, आदेश की गारंटी नहीं है। लेकिन तालिका में कोई बदलाव नहीं होने पर मैंने कभी भी डीबीएमएस रीडरिंग डेटा नहीं देखा है।

क्या आपने कभी तालिका में कोई बदलाव नहीं होने पर एक गैर निर्धारक क्रम में डेटा चुनने का अनुभव किया है?

क्या हमेशा क्लॉज द्वारा ऑर्डर करने का सबसे अच्छा अभ्यास है?

+6

वहाँ परिभाषा के द्वारा, है, * एसक्यूएल अनुरूप डेटाबेस में कोई डिफ़ॉल्ट सॉर्ट क्रम *। अधिकांश डेटाबेस एक ही क्वेरी को निष्पादित किए जाने पर क्वेरी की प्रकृति या यहां तक ​​कि इंडेक्स की स्थिति के आधार पर एक अलग क्रम में रिकॉर्ड लौटा सकता है। आदेश हमेशा महत्वपूर्ण है, आपको हमेशा उस क्रम को निर्दिष्ट करना चाहिए जिसमें आप डेटा चाहते हैं। अनिर्दिष्ट आदेश वाली क्वेरी दोहराया जा सकता है। –

उत्तर

38

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

+0

आप पहले थे, सभी –

+0

पहले होने के बाद। – Yada

9

यदि आप डेटा को लगातार आदेश देना चाहते हैं, तो हाँ - आपको ORDER BY का उपयोग करना होगा।

6

हां। ORDER BY के बिना कोई "डिफ़ॉल्ट आदेश" नहीं है, और इस बात की कोई गारंटी नहीं है कि आपको फीफो/एलआईएफओ या किसी अन्य ऑर्डर में डेटा वापस मिल जाएगा।

जहां तक ​​डेवलपर्स का उपयोग कर "तालिका से आईडी चुनने, नाम", वे या तो अयोग्य हो या वे परवाह नहीं है क्या आदेश कुछ भी दिखाई देता है।

3

कोई गंभीर आरडीबीएमएस किसी भी क्रम की गारंटी देता है, जब तक कि आप एक स्पष्ट ऑर्डर द्वारा निर्दिष्ट करें।

कुछ और सिर्फ शुद्ध किस्मत या एक्टोडल है - यदि आप ऑर्डर चाहते हैं, तो आपको ऑर्डर देना होगा - इसके चारों ओर कोई रास्ता नहीं।

1

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

3

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

This other stackoverflow thread मूल रूप से है व्यवहार का प्रदर्शन करने के लिए एसक्यूएल सर्वर, AlexK blogged a repo के संबंध में एक ही अवधारणा को कवर करना।

3

SELECT ... FROM table जैसी एक साधारण क्वेरी भी विभिन्न आदेशों में डेटा वापस कर सकती है। मैं सिद्धांत में सच होने के बारे में जानता हूं, मुझे यह अभ्यास में सच होने के बारे में पता है, और जब मैंने तालिका में कोई डेटा परिवर्तन नहीं किया है, तब भी जब मैं आदेशों के बीच ऑर्डर बदलता हूं तो मैंने कई मामलों को देखा है।

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

15

जैसा कि अन्य पोस्टर्स का उल्लेख है, यदि आप सॉर्ट ऑर्डर निर्दिष्ट नहीं करते हैं, तो SQL मानक का कहना है कि परिणाम प्रोसेसर को जो भी ऑर्डर मिल सकता है वह सबसे अधिक सुविधाजनक और कुशल पाता है।

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

यदि आप फिर राज्य और शहर फ़ील्ड (उस क्रम में) पर एक अनुक्रमणिका जोड़ते हैं, और फिर WHERE STATE = 'NY' के लिए पूछताछ क्वेरी प्रोसेसर निर्णय ले सकता है कि यह करने के बजाय राज्य = 'NY' के लिए इंडेक्स प्रविष्टियों को स्कैन करने के लिए और अधिक कुशल है एक पूर्ण टेबल स्कैन। इस मामले में यह शायद राज्य, शहर आदेश में पंक्तियों को पूरा करेगा।

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

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

3

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

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

इसलिए यह एक ORDER BY में डालने के लिए केवल सबसे अच्छा अभ्यास है, जब

  • डेटा के आदेश महत्वपूर्ण है; और
  • सॉर्टिंग डीबी स्तर पर अधिक कुशल है।

यानी अगर फ्रंट एंड डेवलपर इसे फिर से "पुनः क्रमबद्ध" करने जा रहा है, तो कोई बिंदु नहीं है, क्योंकि यह कुल प्रोसेसिंग समय को बचाने की संभावना नहीं है।

+0

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

0

मैं इसे लिख रहा हूं अगर कोई ऐसा करना चाहेगा जैसा मैंने किया था।

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

CREATE TABLE [dbo].[tableA]([DateTime] [datetime] NOT NULL, 
CONSTRAINT [PK_tableA] 
PRIMARY KEY CLUSTERED ([DateTime] DESC) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] 

या एसएसएमएस में ...

enter image description here

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