SSMS एक तालिका के शीर्ष पर नई पंक्तियाँ क्यों डाल रहा है नीचे नहीं?


14

जब भी मैं मैन्युअल रूप से SQL सर्वर प्रबंधन स्टूडियो 2008 (डेटाबेस SQL ​​Server 2005) में एक तालिका में एक पंक्ति सम्मिलित करता हूं, तो मेरी नई पंक्ति नीचे के बजाय सूची के शीर्ष पर दिखाई देती है। मैं पहचान कॉलम का उपयोग कर रहा हूं और इसके परिणामस्वरूप चीजें होती हैं

id  row
42 first row
1 second row
2 third row

जब पंक्तियों को लाया जाता है और स्पष्ट रूप से आदेश नहीं दिया जाता है। इसका परिणाम एक अलग उपस्थिति में होता है जब पंक्तियों को वेब ऐप के लिए लाया जाता है और एक TOP 1क्वेरी वापस आती है।

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


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

मेरी-गो-राउंड स्कैन से भी अवगत रहें ।
माइकल ग्रीन

जवाबों:


21

SQL वर्ल्ड में, ऑर्डर डेटा के सेट की एक अंतर्निहित संपत्ति नहीं है। इस प्रकार, आपको अपने RDBMS से कोई गारंटी नहीं मिलती है कि आपका डेटा एक निश्चित क्रम में वापस आ जाएगा - या यहां तक ​​कि एक सुसंगत क्रम में - जब तक आप अपने डेटा को एक ORDER BYखंड के साथ क्वेरी नहीं करते हैं ।

से क्रेग फ्रीडमैन :

ORDER BY के साथ शीर्ष संयोजन संयुक्त पंक्तियों के सेट में नियतिवाद जोड़ता है। ORDER BY के बिना, लौटी पंक्तियों का सेट क्वेरी प्लान पर निर्भर करता है और निष्पादन से निष्पादन तक भी भिन्न हो सकता है।

ORDER BYयदि आप अपने परिणाम सेट में अच्छी तरह से परिभाषित और सुसंगत क्रम की अपेक्षा करते हैं तो हमेशा उपयोग करें । अपने प्रश्नों में डेटा के एक निश्चित क्रम की गारंटी के लिए आपका डेटाबेस डिस्क पर पंक्तियों को कैसे संग्रहीत कर सकता है (जैसे क्लस्टर इंडेक्स के माध्यम से) पर कभी भरोसा न करें।


13

बस अन्य उत्तरों को बढ़ाने के लिए: एक तालिका, परिभाषा के अनुसार, पंक्तियों का एक अनियंत्रित सेट है। यदि आप एक ORDER BYक्लॉज़ निर्दिष्ट नहीं करते हैं , तो SQL सर्वर पंक्तियों को वापस करने के लिए स्वतंत्र है जो भी उस क्रम में सबसे कुशल है। यह अक्सर डालने के क्रम के साथ मेल खाने के लिए होता है, क्योंकि अधिकांश तालिकाओं में पहचान, डेटाटाइम या अन्य मोनोटोनिक रूप से बढ़ते स्तंभों पर एक क्लस्टर सूचकांक होता है, लेकिन आपको इसे बिल्कुल उसी तरह से व्यवहार करना चाहिए: एक संयोग। यह नए डेटा के साथ बदल सकता है, एक आँकड़े अपडेट, एक ट्रेस ध्वज, मैक्सडॉप में परिवर्तन, क्वेरी संकेत, जुड़ने के लिए परिवर्तन या जहां क्वेरी में क्लॉस, सर्विस पैक / संचयी अद्यतन / हॉटफ़िक्स / अपग्रेड के कारण ऑप्टिमाइज़र में परिवर्तन, डेटाबेस को किसी भिन्न सर्वर पर ले जाना, आदि।

दूसरे शब्दों में, और मुझे पता है कि आप पहले से ही जवाब जानते हैं, लेकिन यह पर्याप्त नहीं कहा जा सकता है:

यदि आप किसी क्वेरी के आदेश पर भरोसा करना चाहते हैं, तो हमेशा जोड़ें ORDER BY


मैं आदेश के आधार पर योजना नहीं बना रहा था, लेकिन नेत्रहीन यह थोड़ा कष्टप्रद है कि मेरे पिछले सम्मिलित आइटम अचानक शीर्ष पर हैं।
बेन ब्रोका

मुझे लगता है कि यह है क्योंकि आप ओपन टेबल का उपयोग कर रहे हैं। प्रबंधन स्टूडियो 2008 में इस कमांड को "एडिट टॉप एन पंक्तियाँ" और "टॉप एन पंक्तियों का चयन करें" में बदल दिया गया है - जब आप बाद वाले को चुनते हैं, तो आप परिणामी क्वेरी को संपादित करने के लिए स्वतंत्र हैं, जैसे शीर्ष को हटा दें और एक ऑर्डर जोड़ें।
हारून बर्ट्रेंड

यह प्रबंधन स्टूडियो 2008 है, सर्वर 2005 है, स्पष्ट होना चाहिए था। मुझे नहीं पता था कि एक "ओपन टेबल" कमांड थी, मैंने हमेशा selectस्टैच्यूज़ का इस्तेमाल किया है
बेन ब्रोका

4
ठीक है, अच्छी तरह से अभी भी खड़ा है, मैं समझता हूं कि यह कष्टप्रद है कि डेटा एक ऐसे क्रम में वापस आता है जिसकी आपको उम्मीद नहीं है, लेकिन मुझे उम्मीद है कि अब SQL सर्वर वास्तव में परवाह नहीं करता है कि आप क्या आदेश देते हैं जब तक आप यह नहीं बताते कि आप परवाह करते हैं खंड द्वारा एक आदेश जोड़कर। :-)
हारून बर्ट्रेंड

1

यह इसलिए है क्योंकि तालिका एक ढेर तालिका (सबसे अधिक संभावना है) और अनुक्रमित नहीं है। PRIMARY KEYसाथ ही आईडी कॉलम भी बनाएं IDENTITY। एसक्यूएल सर्वर शारीरिक रूप से इंडेक्स के आधार पर डेटा को स्टोर करता है - उदाहरण के लिए, यदि आईडी एक क्लस्टर इंडेक्स (जैसे कि प्राथमिक कुंजी) है तो डेटा को आईडी के क्रम में भौतिक रूप से संग्रहीत किया जाएगा और बिना क्वेरी के भी उस तरह से लौटाया जाएगा एक ORDER BYखंड। अन्यथा, पंक्तियों का क्रम डेटाबेस के लिए महत्वपूर्ण नहीं है। नतीजतन, एक आवेदन डेटाबेस में पंक्तियों के क्रम पर निर्भर करता है (और साथ ही साथ एक निश्चित क्रम में होने के आधार पर) एक अच्छा अभ्यास नहीं है। एप्लिकेशन को पंक्तियों की पहचान करने के लिए डेटाबेस में जो भी चाबियाँ हैं, उनके साथ काम करने की आवश्यकता है।


जानकार अच्छा लगा। मुझे पता था कि यह उपयोग करने के लिए एप्लिकेशन को बदलने के लिए एक संकेत था order by(यह एक बुरा व्यवहार के साथ एक विरासत वाला ऐप है), लेकिन मैं वास्तव में सोच रहा था कि ऐसा क्यों हुआ।
बेन ब्रोका

5
तालिका की संरचना बदले सिर्फ इतना है कि SELECT *बिना ORDER BY हो सकता है "सही" क्रम में वापस आने के लिए (लेकिन अभी भी गारंटी नहीं दी जा)?
हारून बर्ट्रेंड

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

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

4
वैसे भी मेरी बात है कि एक जोड़ने था ORDER BYखंड एक बेहतर गारंटी है मेज पर स्कीमा परिवर्तन करने और की तुलना में (बहुत कम विघटनकारी कोई बात नहीं) उम्मीद कर रहा है कि आदेश के रूप में आप उम्मीद कर हमेशा के लिए होगा।
हारून बर्ट्रेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.