तालिका पंक्तियों के छोटे हिस्सों से जुड़े प्रश्नों के लिए, सूचकांक हमेशा फायदेमंद होते हैं, 100
पंक्तियां या 1,000,000
हो।
इस तरह के प्रश्नों:
SELECT *
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
संभवत: HASH JOIN
का उपयोग करेगा
योजनाओं और प्रदर्शन के विवरण के साथ उदाहरण के लिए अपने ब्लॉग में इस प्रविष्टि देखें। छोटी तालिका के लिए एक हैश टेबल बनाया जाएगा, और बड़ी तालिका से पंक्तियों का उपयोग हैश तालिका की जांच के लिए किया जाएगा।
ऐसा करने के लिए, कोई अनुक्रमणिका की आवश्यकता नहीं है।
हालांकि, इस प्रश्न:
SELECT *
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
WHERE t1.othercol = @value
NESTED LOOPS
का उपयोग करेगा: बाहरी तालिका (table1
) से पंक्तियों table1.othercol
पर एक सूचकांक का उपयोग कर खोजा जाएगा, और भीतरी मेज से पंक्तियों (table2
) हो जाएगा table2.col
पर एक इंडेक्स का उपयोग करके खोजा गया।
यदि आपके पास col1
पर कोई अनुक्रमणिका नहीं है, तो HASH JOIN
का उपयोग किया जाएगा जिसके लिए दोनों टेबल और सभी संसाधनों से सभी पंक्तियों को स्कैन करने की आवश्यकता है ताकि हैश तालिका बनाई जा सके।
इंडेक्स इस तरह के प्रश्नों के लिए भी उपयोगी होते हैं:
SELECT t2.col
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
, जिस स्थिति में इंजन table2
में ही सभी को पढ़ने के लिए की जरूरत नहीं है: eveything आप इस प्रश्न के लिए की जरूरत सूचकांक में पाया जा सकता है , जो तालिका से बहुत छोटा हो सकता है और पढ़ने के लिए और अधिक कुशल हो सकता है।
और, बेशक, अगर आप की जरूरत है अपने डेटा सॉर्ट किया और दोनों table1.col
और table2.col
सूचक है, तो निम्न क्वेरी:
SELECT *
FROM table1 t1
JOIN table2 t2
ON t2.col = t1.col
ORDER BY
t2.col
शायद MERGE JOIN
विधि है, जो सुपर तेज है का उपयोग करेगा अगर दोनों इनपुट rowset क्रमबद्ध हैं, और इसका आउटपुट भी सॉर्ट किया गया है, जिसका अर्थ है कि ORDER BY
निःशुल्क आता है।
ध्यान दें कि यदि आपके पास कोई अनुक्रमणिका नहीं है, तो भी एक ऑप्टिमाइज़र Eager Spool
आपकी छोटी तालिका का चयन कर सकता है, जिसका अर्थ है क्वेरी की अवधि के लिए अस्थायी अनुक्रमणिका बनाना और क्वेरी समाप्त होने के बाद इंडेक्स को छोड़ देना।
यदि क्वेरी छोटी है, तो यह बहुत तेज़ होगा, लेकिन फिर, एक सूचकांक चोट नहीं पहुंचाएगा (SELECT
प्रश्नों के लिए मेरा मतलब है)। अगर अनुकूलक को इसकी आवश्यकता नहीं होगी, तो इसका उपयोग नहीं किया जाएगा।
नोट, हालांकि, एक सूचकांक बनाने DML
प्रदर्शन को प्रभावित कर सकता है, लेकिन यह अन्य कहानी है।
वास्तव में, डेटाबेस एक ही पृष्ठ के भीतर सॉर्ट कुंजी नहीं करता है। तो जब तक कि उस बिंदु से परे नहीं हो जाता तब तक कोई लाभ नहीं होता है। और शायद उससे परे कई पृष्ठों के लिए। – dkretz
@Robert: जब आप क्वेरी में केवल अनुक्रमित कॉलम का उपयोग करते हैं या जब आपको सॉर्ट करने के लिए अपने डेटा की आवश्यकता होती है तो उन्हें भी लाभ होता है। और नहीं, वे हमेशा चुनिंदा लोगों पर, जहां पर क्लॉज पर लाभ नहीं होते हैं। – Quassnoi
Quassnoi, मैंने आपके ब्लॉग पोस्ट को देखा। बस इतना ही पता है, हमारे डेटाबेस को अनुक्रमणित करने का अंतिम निर्णय (इस पोस्ट पर अतिरिक्त जानकारी के आधार पर: stackoverflow.com/questions/1033796/...) सभी विदेशी कुंजीों को इंडेक्स करना था जो कम से कम 10 में लुकअप टेबल में शामिल होने में भाग लेते हैं रिकॉर्ड करता है। –