2012-11-22 8 views
7

में शामिल है मैं एनडीपीआर (डिस्क पेज पढ़ने की संख्या) के संदर्भ में (सबसे कुशल) ब्लॉक नेस्टेड लूप में शामिल होने की लागत की गणना करने की कोशिश कर रहा हूं। मान लीजिए आप फार्म के एक प्रश्न है:ब्लॉक नेस्टेड लूप की लागत की गणना

SELECT COUNT(*) 
FROM county JOIN mcd 
ON count.state_code = mcd.state_code 
AND county.fips_code = mcd.fips_code 
WHERE county.state_code = @NO 

जहां @NO क्वेरी से प्रत्येक निष्पादन पर एक राज्य कोड दिया जाता है।

मुझे पता है कि मैं का उपयोग कर NPDR प्राप्त कर सकते हैं: NPDR(R x S) = |Pages(R)| + Pages(R)/B - 2 . |P ages(S)|

(जहां छोटे तालिका आदेश कम पेज का निर्माण करने के बाहरी के रूप में प्रयोग किया जाता है पढ़ता Ergo:। आर = काउंटी, एस = एमसीडी)।

मैं भी है कि पृष्ठ आकार = 2048 बाइट्स

Pointer = 8 byte 
Num. rows in mcd table = 35298 
Num. rows in county table = 3141 
Free memory buffer pages B = 100 
Pages(X) = (rowsize)(numrows)/pagesize 

क्या मैं यह पता लगाने की कैसे "WHERE county.state_code = @NO" मेरे लागत को प्रभावित करता है कोशिश कर रहा हूँ पता है?

आपके समय के लिए धन्यवाद।

+2

NDPR (या NPDR) क्या है? मैं कुछ अनुमान लगा रहा हूं जैसे फार्मूला से गंदा पृष्ठ पढ़ता है। – Laurence

+0

हां, क्षमा करें। मुझे यह निर्दिष्ट करना चाहिए था। एनपीडीआर = पृष्ठ डिस्क की संख्या पढ़ता है। – JB2

उत्तर

1

प्रथम सूत्र आप ने लिखा के बारे में टिप्पणियों के एक जोड़े: - बजाय 'बी - 1 "के

  • मुझे यकीन है कि क्यों यह आप" 2 बी' नहीं लिख रहा हूँ। एक सैद्धांतिक परिप्रेक्ष्य से, आपको संबंध एस में पढ़ने के लिए एक बफर पृष्ठ की आवश्यकता है (आप इसे एक समय में एक पृष्ठ को पढ़कर कर सकते हैं)।

  • सुनिश्चित करें कि आप सभी ब्रैकेट का उपयोग करें। मैं सूत्र के रूप में लिखते थे:
    NPDR(R x S) = |Pages(R)| + |Pages(R)|/(B-2) * |Pages(S)|

  • सूत्र में सभी नंबरों को गिरफ्तार करने की आवश्यकता होगी (लेकिन यह nitpicking है)।

  • सामान्य BNLJ सूत्र के लिए विवरण:

    • आप छोटे संबंध (आर) से के रूप में कई tuples में पढ़ा के रूप में आप बी -1 या बी -2 पृष्ठों लायक स्मृति में रख सकते हैं (tuples के)। (| पेज (एस) |)

    • tuples के लायक बी -2 पृष्ठों के प्रत्येक समूह के लिए, आप तो पूरी एस संबंध को पढ़ने के लिए संबंध के उस विशेष श्रेणी के लिए शामिल होने के प्रदर्शन करने के लिए आर

    • शामिल होने के अंत में, संबंध आर को एक बार पढ़ा जाता है और संबंध एस को कई बार पढ़ा जाता है क्योंकि हमने मेमोरी बफर भर दिया है, अर्थात् |Pages(R)|/(B-2) बार।

अब जवाब:

  • अपने उदाहरण में एक चयन मानदंड (इस मामले में मेज देश) संबंध आर के लिए आवेदन किया है। यह क्वेरी का WHERE county.state_code = @NO हिस्सा है। इसलिए, सामान्य सूत्र सीधे लागू नहीं होता है।

  • संबंध आर से पढ़ने पर (यानी।, टेबल आपके उदाहरण में देश), हम सभी गैर-क्वालीफाइंग टुपल्स को त्याग सकते हैं जो चयन मानदंडों से मेल नहीं खाते हैं। यह मानते हुए कि संयुक्त राज्य अमेरिका में 50 राज्य हैं और सभी राज्यों में समान संख्या में काउंटी हैं, तालिका में टुपल्स का केवल 2% देश औसत पर योग्यता प्राप्त करता है और स्मृति में संग्रहीत करने की आवश्यकता होती है। इससे जुड़ने के आंतरिक पाश के पुनरावृत्ति की संख्या कम हो जाती है (यानी, संबंध एस/टेबल एमसीएस को स्कैन करने के लिए हमें कितनी बार आवश्यकता होती है)। 2% संख्या स्पष्ट रूप से अनुमानित औसत है और वास्तविक दिए गए राज्य के आधार पर बदल जाएगी।

  • सूत्र आपकी समस्या के लिए इसलिए हो जाता है:
    NPDR(R x S) = |Pages(County)| + |Pages(County)|/(B - 2) * |Counties in state @NO|/|Rows in table County| * |Pages(Mcd)|