जब जॉइन करते हैं तो SQL सर्वर ऑर्डर कैसे देता है?


10

SQL सर्वर क्वेरी निष्पादन के परिणाम सेट में रिकॉर्ड के क्रम का कैसे पता लगाता है?

मैं इसके प्रमुख या पूंछ बनाने की कोशिश कर रहा हूं, लेकिन खुद को मेरे सिर को खरोंच रहा हूं। जब मैं फ़ील्ड बदलता हूं तो मैं ऑर्डर चुन रहा हूं वह भी बदल जाता है। जब मैं नीचे SQL को निष्पादित करता हूं तो मुझे एक SELECT *ही रिकॉर्ड मिलता है, लेकिन बहुत अलग क्रम में।

 SELECT TOP (900)
    AD.ATTACHMENTID,
    AD.NAME,
    AD.ISINLINE,
    AD.INSERTEDDATETIME,
    ATMT.ATTACHMENTBLOB,
    U.UFID
  FROM ATTACHMENTDETAIL AD WITH (NOLOCK)
  INNER JOIN MESSAGEATTACHMENT MA ON MA.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN ATTACHMENT ATMT ON ATMT.ATTACHMENTID = AD.ATTACHMENTID
  INNER JOIN MESSAGE MSG ON MSG.ID = MA.MESSAGEID
  INNER JOIN MESSAGEDETAIL MD ON MD.MESSAGEID = MA.MESSAGEID
  INNER JOIN [USER] U ON U.ID = MD.USERID
  LEFT OUTER JOIN XmlExtractionMapping XM ON MA.MESSAGEID = XM.MessageId
    WHERE AD.FILEBOXTOKEN IS NULL 
    AND (XM.XMLEXTRACTIONDATE IS NOT NULL OR 
         (MSG.MESSAGESOURCEID = 1 AND MD.FolderId <> -4))
    AND AD.ISINLINE = 'FALSE'

6
टिप्पणियों / प्रश्नों की एक जोड़ी: (1) केवल एक टेबल पर मैजिक पिक्सी-डस्ट टर्बो बटन NOLOCK का उपयोग क्यों करें? क्या आपने वूडू के बजाय आरसीएसआई का उपयोग करने पर विचार किया है? (२) आप उचित स्कीमा उपसर्गों का उपयोग क्यों नहीं कर रहे हैं? पूर्व के लिए, के लिए वेब खोजें NOLOCK- आपको सभी प्रकार के कारण दिखाई देंगे कि आपको इसका उपयोग क्यों नहीं करना चाहिए। बाद के लिए, देखें sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/...
हारून बर्ट्रेंड

RCSI? कृपया समझाएँ ...
kacalapy 21

2
RCSI = कमिटेड स्नैपशॉट अलगाव पढ़ें। देखें stackoverflow.com/questions/816650/...
हारून बर्ट्रेंड

एक ORDER BYखंड के बिना , SQL सर्वर (और कोई अन्य RDBMS) जो कुछ भी ऐसा लगता है
निक चामास

जवाबों:


17

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

यदि आप एक पूर्वानुमेय आदेश चाहते हैं, तो आप ORDER BYक्वेरी पर उपयोग क्यों नहीं करते हैं ? जैसा कि लिखा गया है, SQL निर्दिष्ट करता है कि किसी भी क्रम में 900 पंक्तियाँ स्वीकार्य हैं।

हालांकि, बहुत सारे मामलों में, आप एक ही आदेश को एक ही क्वेरी के लिए बार-बार देखते हैं, जब तक आप नहीं कहते हैं, कोई गारंटी नहीं है ORDER BY <something>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.