2009-12-29 12 views

उत्तर

16

NESTED LOOPS अच्छा है अगर लूप के अंदर की स्थिति sargable है, तो सूचकांक रिकॉर्ड की संख्या को सीमित करने के लिए उपयोग किया जा सकता है।

इस तरह एक प्रश्न के लिए:

SELECT * 
FROM a 
JOIN b 
ON  b.b1 = a.a1 
WHERE a.a2 = @myvar 

, a साथ प्रमुख, a से प्रत्येक रिकॉर्ड रखा जाएगा और b में सभी इसी रिकॉर्ड नहीं मिले किया जाना चाहिए।

यदि b.b1 अनुक्रमित है और इसमें उच्च कार्डिनिटी है, तो NESTED LOOP एक पसंदीदा तरीका होगा।

SQL Server में, यह भी गैर equijoins निष्पादित करने के लिए (ON खंड में = हालत के अलावा कुछ)

HASH JOIN सबसे तेजी से विधि है सब (या लगभग सभी) रिकॉर्ड पार्स किया जाना चाहिए अगर एक ही रास्ता है।

यह b से सभी रिकॉर्ड लेता है, उन पर एक हैश टेबल बनाता है, फिर a से सभी रिकॉर्ड लेता है और हैश तालिका देखने के लिए एक कॉल के रूप में शामिल कॉलम के मान का उपयोग करता है।

  • NESTED LOOPS इस समय लगता है:

    Na * (Nb/C) * R,

    जहां Na और Nba और b में अभिलेखों का नंबर दिए गए हैं, C सूचकांक प्रमुखता है, और R है के लिए आवश्यक निरंतर समय पंक्ति लुकअप (1SELECT, WHERE और ORDER BY खंडों में सभी फ़ील्ड इंडेक्स द्वारा कवर किए गए हैं, के बारे में 10 अगर वे नहीं कर रहे हैं)

  • HASH JOIN इस समय लगता है:

    Na + (Nb * H)

    , जहां H का निर्माण और हैश तालिका (देखने के रिकॉर्ड के अनुसार करने के लिए) की आवश्यकता स्थिरांक का योग है। वे इंजन में प्रोग्राम किए गए हैं।

SQL Server, प्रमुखता तालिका आंकड़ों का उपयोग कर की गणना की गणना करता है और दो मानों तुलना और सबसे अच्छा योजना चुनता है।

1

आमतौर पर, यह उन सेटों के आकार पर निर्भर होने जा रहा है जो शामिल हो रहे हैं। Itzik द्वारा बेन-गण:

मैं अत्यधिक "T-SQL क्वैरी माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008 के अंदर": पढ़ने की सलाह

http://www.solidq.com/insidetsql/books/insidetsql2008/

(2005 संस्करण के रूप में अच्छी तरह से बस के रूप में इस विषय पर लागू होता है)

वह आपके प्रश्नों के साथ-साथ कई अन्य लोगों को आपके प्रश्नों से अधिक लाभ उठाने के लिए आता है।

संबंधित मुद्दे