sql server - इंडेक्स बनाते समय INCLUDE क्लॉज का उपयोग क्यों करें?




sql-server sql-server-2008 (5)

इंडेक्स परिभाषा में उल्लिखित सभी कॉलम के कुल आकार की सीमा है। हालांकि, मैंने कहा कि मुझे कभी भी इंडेक्स बनाना नहीं था। मेरे लिए, बड़ा लाभ यह तथ्य है कि आप एक सूचकांक के साथ अधिक प्रश्नों को कवर कर सकते हैं जिसमें कॉलम शामिल हैं क्योंकि उन्हें किसी भी विशेष क्रम में परिभाषित नहीं किया जाना चाहिए। सूचकांक के भीतर एक सूचकांक के रूप में सोचो। एक उदाहरण StoreID होगा (जहां StoreID कम चयनशीलता है जिसका अर्थ है कि प्रत्येक स्टोर कई ग्राहकों से जुड़ा हुआ है) और उसके बाद ग्राहक जनसांख्यिकी डेटा (LastName, FirstName, DOB): यदि आप केवल इस कॉलम में इन कॉलम को इनलाइन करते हैं (StoreID, LastName , फर्स्टनाम, डीओबी), आप केवल उन ग्राहकों के लिए कुशलतापूर्वक खोज कर सकते हैं जिनके लिए आप StoreID और LastName जानते हैं।

दूसरी तरफ, स्टोरआईडी पर इंडेक्स को परिभाषित करना और लास्टनाम, फर्स्टनाम, डीओबी कॉलम समेत आपको दो खोज-इंडेक्स को स्टोरआईडी पर अनुमानित करने की अनुमति मिलेगी और फिर किसी भी कॉलम पर भविष्यवाणी की जाएगी। यह आपको स्टोर आईडी के साथ शुरू होने तक सभी संभावित खोज क्रमिकताओं को कवर करने देगा।

70-433 परीक्षा के लिए अध्ययन करते समय मैंने देखा कि आप निम्नलिखित दो तरीकों में से एक में एक कवर इंडेक्स बना सकते हैं।

CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)

- या -

CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)

शामिल खंड मेरे लिए नया है। आप इसका उपयोग क्यों करेंगे और यह निर्धारित करने के लिए आप किन दिशा-निर्देशों का सुझाव देंगे कि कवर कवर के साथ या बिना किसी कवरेज इंडेक्स को बनाना है या नहीं?


एक अतिरिक्त विचार जो मैंने पहले से दिए गए उत्तरों में नहीं देखा है, यह है कि कॉलम डेटा प्रकारों का हो सकता है जिन्हें इंडेक्स कुंजी कॉलम, जैसे वर्कर (अधिकतम) के रूप में अनुमति नहीं है।

यह आपको कवरेज इंडेक्स में ऐसे कॉलम शामिल करने की अनुमति देता है। मुझे हाल ही में एक nHibernate जेनरेट क्वेरी प्रदान करने के लिए ऐसा करना पड़ा, जिसमें उपयोगी सूचकांक के साथ SELECT में बहुत से कॉलम थे।


बेसिक इंडेक्स कॉलम सॉर्ट किए गए हैं, लेकिन कॉलम को सॉर्ट नहीं किया गया है। यह इंडेक्स को बनाए रखने में संसाधनों को बचाता है, जबकि अभी भी क्वेरी को कवर करने के लिए शामिल कॉलम में डेटा प्रदान करना संभव बनाता है। इसलिए, यदि आप प्रश्नों को कवर करना चाहते हैं, तो आप इंडेक्स के सॉर्ट किए गए कॉलम में पंक्तियों का पता लगाने के लिए खोज मानदंड डाल सकते हैं, लेकिन फिर गैर-खोज डेटा वाले अतिरिक्त, छोड़े गए कॉलम "शामिल" कर सकते हैं। यह निश्चित रूप से इंडेक्स रखरखाव में सॉर्टिंग और विखंडन की मात्रा को कम करने में मदद करता है।


यदि आप ऐसा करके ऐसा करते हैं, तो आप अपने प्रश्नों को "कवर" कर सकते हैं, तो आप गैर-क्लस्टर इंडेक्स के पत्ते के स्तर पर एक या अधिक कॉलम जोड़ने के लिए INCLUDE का उपयोग करेंगे।

कल्पना करें कि आपको किसी कर्मचारी की आईडी, डिपार्टमेंट आईडी और अंतिम नाम के लिए पूछताछ करने की आवश्यकता है।

SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5

यदि आपके पास किसी दिए गए विभाग के लिए कर्मचारी मिलने के बाद, (कर्मचारी कर्मचारी, विभाग आईडी) पर एक गैर-क्लस्टर इंडेक्स होता है, तो आपको अंतिम पूर्ण कॉलम प्राप्त करने के लिए वास्तविक पूर्ण कर्मचारी रिकॉर्ड प्राप्त करने के लिए अब "बुकमार्क लुकअप" करना होगा । यदि आपको बहुत से कर्मचारी मिलते हैं तो यह प्रदर्शन के मामले में बहुत महंगा हो सकता है।

यदि आपने अपनी अनुक्रमणिका में उस अंतिम नाम को शामिल किया था:

CREATE NONCLUSTERED INDEX NC_EmpDep 
  ON Employee(EmployeeID, DepartmentID)
  INCLUDE (Lastname)

तो आपको आवश्यक सभी जानकारी गैर-क्लस्टर सूचकांक के पत्ते के स्तर में उपलब्ध है। केवल गैर-क्लस्टर इंडेक्स की तलाश करके और किसी दिए गए विभाग के लिए अपने कर्मचारियों को ढूंढकर, आपके पास सभी आवश्यक जानकारी है, और इंडेक्स में पाए गए प्रत्येक कर्मचारी के लिए बुकमार्क लुकअप अब आवश्यक नहीं है -> आप बहुत समय बचाते हैं।

जाहिर है, आप प्रत्येक गैर-क्लस्टर इंडेक्स में प्रत्येक कॉलम शामिल नहीं कर सकते हैं - लेकिन यदि आपके पास ऐसे प्रश्न हैं जो "कवर" होने के लिए केवल एक या दो कॉलम गायब हैं (और यह बहुत उपयोग किया जाता है), तो उनको शामिल करना बहुत उपयोगी हो सकता है एक उपयुक्त गैर क्लस्टर सूचकांक में।


यह चर्चा महत्वपूर्ण बिंदु पर अनुपलब्ध है: प्रश्न यह नहीं है कि "गैर-कुंजी-कॉलम" इंडेक्स -कॉलम या शामिल -कॉलम के रूप में शामिल करने के लिए बेहतर हैं।

सवाल यह है कि इंडेक्स में वास्तव में आवश्यक कॉलम को शामिल करने के लिए शामिल-तंत्र का उपयोग करना कितना महंगा है? (आमतौर पर जहां-खंडों का हिस्सा नहीं है, लेकिन अक्सर चयन में शामिल होता है)। तो आपकी दुविधा हमेशा होती है:

  1. आईडी 1, आईडी 2 ... आईडीएन अकेले या इंडेक्स पर इंडेक्स का प्रयोग करें
  2. आईडी 1, आईडी 2 पर इंडेक्स का उपयोग करें ... आईडीएन प्लस में col1, col2 ... colN शामिल हैं

कहां: id1, id2 ... idN कॉलम अक्सर कॉलम और col1, col2 में उपयोग किए जाते हैं ... coln कॉलम अक्सर चुने जाते हैं, लेकिन आमतौर पर प्रतिबंधों में उपयोग नहीं किया जाता है

(इंडेक्स-कुंजी के हिस्से के रूप में इन सभी कॉलम को शामिल करने का विकल्प हमेशा मूर्खतापूर्ण होता है (जब तक कि वे प्रतिबंधों में भी उपयोग नहीं किए जाते) - क्योंकि यह हमेशा बनाए रखना अधिक महंगा होगा क्योंकि इंडेक्स को अद्यतन और सॉर्ट किया जाना चाहिए जब भी "कुंजी" नहीं बदला है)।

तो विकल्प 1 या 2 का उपयोग करें?

उत्तर: यदि आपकी तालिका शायद ही कभी अपडेट की जाती है - अधिकतर इसमें से डाली / हटा दी जाती है - तो यह कुछ "हॉट कॉलम" को शामिल करने के लिए शामिल-तंत्र का उपयोग करने के लिए अपेक्षाकृत सस्ती है (जिसे अक्सर चयन में उपयोग किया जाता है - लेकिन अक्सर प्रतिबंधों पर उपयोग नहीं किया जाता है) आवेषण / हटाए जाने के लिए इंडेक्स को किसी भी तरह अद्यतन / सॉर्ट करने की आवश्यकता होती है और इस प्रकार थोड़ा अतिरिक्त ओवरहेड कुछ अतिरिक्त कॉलम को संग्रहीत करने के साथ जुड़ा हुआ है जबकि इंडेक्स को पहले से अपडेट किया जा रहा है। ओवरहेड अतिरिक्त मेमोरी और सीपीयू इंडेक्स पर अनावश्यक जानकारी स्टोर करने के लिए प्रयोग किया जाता है।

यदि कॉलम जिन्हें आप शामिल करते हैं, कॉलम को अक्सर अपडेट किया जाता है (इंडेक्स- कुंजी -कॉलम अपडेट किए बिना) - या - यदि उनमें से बहुत से हैं कि इंडेक्स आपकी तालिका की एक प्रति के करीब हो जाता है - विकल्प 1 का उपयोग करें मैं सुझाव दूंगा! इसके अलावा यदि कुछ शामिल-कॉलम जोड़ना कोई प्रदर्शन-अंतर नहीं करता है - तो आप उन्हें जोड़ने का विचार छोड़ना चाहेंगे :) सत्यापित करें कि वे उपयोगी हैं!

कुंजी (आईडी 1, आईडी 2 ... आईडीएन) में समान मूल्यों की पंक्तियों की औसत संख्या कुछ महत्व भी हो सकती है।

ध्यान दें कि यदि एक कॉलम - जिसे इंडेक्स के शामिल- कॉलम के रूप में जोड़ा जाता है - प्रतिबंध में उपयोग किया जाता है: जब तक इंडेक्स का उपयोग किया जा सकता है ( इंडेक्स- कुंजी- कॉलम के खिलाफ प्रतिबंध के आधार पर) - तब SQL सर्वर मेल खाता है तालिका के चारों ओर महंगी तरीके से जाने के बजाय सूचकांक (पत्ती-नोड-मूल्य) के खिलाफ कॉलम-प्रतिबंध।





indexing