संपादित करें: +1 इस स्थिति में काम करता है क्योंकि यह पता चलता है कि FILE_NUMBER
पूर्णांक का शून्य-गद्देदार स्ट्रिंग संस्करण है। तार के लिए यहाँ एक बेहतर समाधान है ''
(खाली स्ट्रिंग) जोड़ना, जैसा कि एक मूल्य को लागू करना आदेश को प्रभावित कर सकता है, या संख्याओं के लिए कुछ जोड़ सकता है जो एक स्थिर है लेकिन इसमें गैर-नियतात्मक फ़ंक्शन शामिल है, जैसे sign(rand()+1)
। 'अभी भी' को तोड़ने का विचार यहाँ मान्य है, यह सिर्फ इतना है कि मेरा तरीका आदर्श नहीं था।
+1
नहीं, मेरा मतलब यह नहीं है कि मैं किसी भी चीज से सहमत हूं, मेरा मतलब है कि समाधान के रूप में। यदि आप अपनी क्वेरी बदलते हैं ORDER BY cj.FILE_NUMBER + 1
तो TOP 1
वसीयत अलग तरह से व्यवहार करेगी।
आप एक आदेशित क्वेरी के लिए जगह में छोटे पंक्ति के लक्ष्य के साथ देखते हैं, सिस्टम क्रमबद्ध डेटा होने से बचने के लिए, क्रम में डेटा का उपभोग करने की कोशिश करेगा। यह भी हैश टेबल बनाने से बचता है, यह अनुमान लगाता है कि शायद उस पहली पंक्ति को खोजने के लिए बहुत अधिक काम नहीं करना है। आपके मामले में, यह गलत है - उन तीरों की मोटाई से, ऐसा लगता है कि एक एकल मैच खोजने के लिए बहुत सारे डेटा का उपभोग करना है।
उन तीरों की मोटाई बताती है कि आपकी DOCUMENT_QUEUE
(DQ) तालिका आपकी CORRESPONDENCE_JOURNAL
(CJ) तालिका से बहुत छोटी है । और यह कि सबसे अच्छी योजना वास्तव में डीक्यू पंक्तियों के माध्यम से जांचना होगी जब तक कि एक सीजे पंक्ति नहीं मिलती है। वास्तव में, यह वही है जो क्वेरी ऑप्टिमाइज़र (QO) करेगा अगर इसमें यह pesky नहीं था ORDER BY
, जो कि CJ पर कवरिंग इंडेक्स द्वारा अच्छी तरह से समर्थित है।
इसलिए यदि आप ORDER BY
पूरी तरह से गिर गए हैं , तो मुझे उम्मीद है कि आपको एक योजना मिलेगी जिसमें एक नेस्टेड लूप शामिल है, जो DQ में पंक्तियों से अधिक पुनरावृत्ति करता है, यह सुनिश्चित करने के लिए CJ में मांग करता है कि पंक्ति मौजूद है। और इसके साथ ही TOP 1
, एक पंक्ति को खींचने के बाद यह बंद हो जाएगा।
लेकिन अगर आपको वास्तव में FILE_NUMBER
क्रम में पहली पंक्ति की आवश्यकता है , तो आप सिस्टम को उस सूचकांक को अनदेखा करने में छल कर सकते हैं, जो (गलत तरीके से) ऐसा करने में मददगार लगता है, जिसे करके ORDER BY CJ.FILE_NUMBER+1
- हम जानते हैं कि पहले जैसा ही क्रम बना रहेगा, लेकिन महत्वपूर्ण रूप से क्यूओ ऐसा नहीं करता। QO पूरे सेट आउट को प्राप्त करने पर ध्यान केंद्रित करेगा, ताकि एक टॉप एन सॉर्ट ऑपरेटर संतुष्ट हो सके। इस विधि से एक योजना तैयार करनी चाहिए जिसमें ऑर्डर करने के लिए मूल्य वर्क आउट करने के लिए एक कंपाइलर ऑपरेटर होता है, और पहली पंक्ति प्राप्त करने के लिए एक टॉप एन सॉर्ट ऑपरेटर होता है। लेकिन इन के दाईं ओर, आपको एक अच्छा नेस्टेड लूप देखना चाहिए, सीजे पर बहुत सारे सीक। और पंक्तियों की एक बड़ी तालिका के माध्यम से चलने से बेहतर प्रदर्शन जो कि DQ में कुछ भी मेल नहीं खाते हैं।
हैश मैच आवश्यक रूप से भयानक नहीं है, लेकिन यदि आप DQ से लौटने वाली पंक्तियों का सेट CJ से छोटा है (जैसा कि मैं यह होने की उम्मीद करूँगा), तो हैश मैच CJ के बहुत अधिक स्कैन होने वाला है जरूरत से ज्यादा।
नोट: मैंने +0 के बजाय +1 का उपयोग किया है क्योंकि क्वेरी ऑप्टिमाइज़र को यह पहचानने की संभावना है कि +0 कुछ भी नहीं बदलता है। बेशक, वही चीज +1 पर लागू हो सकती है, यदि अभी नहीं, तो भविष्य में किसी बिंदु पर।
DOCUMENT_ID
जो दो तालिकाओं के बीच संबंध को लागू करती है (या हर रिकॉर्ड काCORRESPONDENCE_JOURNAL
मिलान रिकॉर्ड में हैDOCUMENT_QUEUE
)?