चूंकि आपके पास डेटा के दो सेट हैं, उसी मूल्य से आदेश दिया गया है .. क्या आपने नेस्टेड लूप में शामिल होने के बजाय विलय में शामिल होने का प्रयास किया है?
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT COUNT(*)
FROM Address adr INNER JOIN
Auditable a on adr.UniqueId = a.UniqueId
OPTION (LOOP JOIN)
SELECT COUNT(*)
FROM Address adr INNER JOIN
Auditable a on adr.UniqueId = a.UniqueId
OPTION (MERGE JOIN)
SELECT COUNT(*)
FROM Address adr INNER JOIN
Auditable a on adr.UniqueId = a.UniqueId
OPTION (HASH JOIN)
संपादित करें:
ये स्पष्टीकरण वैचारिक कर रहे हैं। SQL सर्वर मेरे उदाहरणों की तुलना में अधिक परिष्कृत परिचालन कर रहा है। यह वैचारिक समझ, एसईटी सांख्यिकी आदेशों के समय और तार्किक आईओ के माप से मेल खाती है, और क्वेरी निष्पादन योजनाओं की परीक्षा - मेरी क्वेरी ऑप्टिमाइज़िंग तकनीक (चार साल से अधिक उम्र के) का आधार बनती है। यह आपकी सेवा कर सकता है साथ ही यह मेरे पास है।
सेटअप
- ताश के पत्तों की 5 डेक प्राप्त करें।
- 1 डेक लें और एक मूल डेटा सेट तैयार करें।
- अन्य 4 डेक लें और बाल डेटा सेट का उत्पादन करें।
- कार्ड मूल्य द्वारा निर्धारित प्रत्येक डेटा को ऑर्डर करें।
- माता-पिता डेटा सेट में कार्ड की संख्या होने दें।
- बच्चे डेटा सेट में कार्ड की संख्या होने दें।
NestedLoop
- माता पिता डेटा सेट के ऊपर से एक कार्ड ले लो।
- मिलान के पहले अवसर के लिए सेट किए गए बाल डेटा सेट के भीतर खोजें (बाइनरी खोज का उपयोग करें)।
- गैर-मिलान मिलने तक पहले मैच से बाल डेटा सेट में आगे बढ़ें। अब आपको सभी मैच मिल गए हैं।
- पैरेंट डेटा सेट में प्रत्येक कार्ड के लिए इसे दोहराएं।
नेस्टेड लूप एल्गोरिथ्म दोहराता माता पिता डेटा सेट, और उसके बाद बच्चे डेटा हर माता-पिता के लिए एक बार सेट खोज करता है, यह लागत बनाने: मीटर * लॉग (एन)
मर्ज
- लें मूल डेटा सेट के शीर्ष से एक कार्ड।
- बाल डेटा सेट के शीर्ष से एक कार्ड लें।
- यदि कार्ड मिलते हैं, तो प्रत्येक डेक के शीर्ष से कार्ड खींचें जब तक प्रत्येक से एक गैर-मिलान नहीं मिलता है। माता-पिता और बाल मैचों के बीच प्रत्येक मिलान करने वाली जोड़ी बनाएं।
- यदि कार्ड मेल नहीं खाते हैं, तो माता-पिता और बाल कार्ड के बीच छोटे खोजें, और उस डेटा सेट के शीर्ष से एक कार्ड लें।
विलय में शामिल होने के बाद एल्गोरिदम एक बार माता-पिता डेटा सेट को पुन: स्थापित करता है और बच्चे डेटा एक बार सेट करता है, इसे लागत बनाते हैं: m + n। यह आदेश दिया जा रहा डेटा पर निर्भर करता है। यदि आप अन-आदेशित डेटा पर विलय में शामिल होने के लिए कहते हैं, तो आपको ऑर्डरिंग ऑपरेशन होगा! इससे लागत (एम * लॉग (एम)) + (एन * लॉग (एन)) + एम + एन है। यहां तक कि कुछ मामलों में नेस्टेड लूप से भी बेहतर हो सकता है।
हैश
- एक कार्ड तालिका प्राप्त करें।
- प्रत्येक कार्ड को मूल डेटा सेट से लें और उसे कार्ड टेबल पर रखें जहां आप इसे पा सकते हैं (कार्ड मूल्य के साथ कुछ भी करने की ज़रूरत नहीं है, केवल आपके लिए सुविधाजनक होना चाहिए)।
- प्रत्येक कार्ड को बच्चे डेटा सेट से लें, कार्डबोर्ड टेबल पर अपने मिलान करने वाले माता-पिता का पता लगाएं और मिलान करने वाली जोड़ी का उत्पादन करें।
हैश एल्गोरिदम में शामिल होने के बाद माता-पिता डेटा सेट एक बार और बच्चे डेटा सेट एक बार फिर से सेट करता है, इसे लागत बनाते हैं: m + n। यह मूल डेटा सेट की संपूर्ण सामग्री को पकड़ने के लिए एक बड़ी पर्याप्त कार्ड तालिका रखने पर निर्भर करता है।
स्रोत
2010-05-12 15:33:53
आपके पास "लंबे समय" क्या है, क्या आपके पास क्वेरी के लिए निष्पादन योजना है? क्या आप टेबल के लिए स्कीमा प्रदान कर सकते हैं? यदि आप कहते हैं कि यह अच्छी तरह से अनुक्रमित है तो इसके लिए कोई भी समय लेने का कोई कारण नहीं है। –
क्या आप क्वेरी प्लान के बारे में कोई जानकारी दे सकते हैं? (उदाहरण के लिए एसक्यूएल सर्वर मैनेजमेंट स्टूडियो या प्लान एक्सएमएल से एक स्क्रीनशॉट) इसके अलावा, पते के किस अनुपात में अंतर्निहित ऑडिटेबल है? –
क्या आपने अनुक्रमित कॉलम में से किसी एक को चुनने का प्रयास किया है? पुराने दिनों में, यह COUNT (adr.uniqueid) कहने में तेज़ी से था क्योंकि यह इंडेक्स से आपको जो कुछ भी चाहिए उसे पढ़ सकता था और कभी भी टेबल पर नहीं जाना पड़ता था। मैं कोशिश करता हूँ। यह भी देखने के लिए जांचें कि तालिका के आंकड़े अद्यतित हैं या नहीं। – MJB