मैंने देखा कि बहुत कम लोग समझते हैं कि SQL सर्वर में अनुक्रमणिका कैसे काम करती है, विशेष रूप से शामिल कॉलम। फिर भी, अनुक्रमणिका प्रश्नों को अनुकूलित करने का एक शानदार तरीका है। सबसे पहले, मुझे शामिल किए गए स्तंभों का भी विचार नहीं आया, लेकिन मेरे प्रयोगों से पता चला कि वे बहुत उपयोगी हैं।
मान लीजिए, हमारे पास निम्न तालिका और क्वेरी है:
CREATE TABLE Person ( PersonID int, FirstName varchar(100), LastName varchar(100), Age int, … … ) SELECT FirstName, LastName, Age FROM Person WHERE FirstName = 'John' and LastName = 'Smith'
यह स्पष्ट है कि PersonID एक प्राथमिक कुंजी है। मान लीजिए कि हमारे पास पहले और अंतिम नामों से एक अनुक्रमणिका है, इसे IX_Person_FirstNameLastName कहते हैं। ऐसी क्वेरी के लिए निष्पादन योजना इस प्रकार दिखाई देगी:
- IX_Person_FirstNameLastName इंडेक्स ट्री की सहायता से निर्दिष्ट प्रथम और अंतिम नामों वाली सभी पंक्तियों का पता लगाना
- इंडेक्स पर डिस्क पर लाइन के वास्तविक स्थान का पता लगाना, वास्तविक स्थान पर जाना और उम्र पढ़ना।
अब, मान लें कि इस क्वेरी को अक्सर निष्पादित किया जाता है। हमें हर बार 2 स्टेप्स को एक्सीक्यूट करना होता है। क्या इसे अनुकूलित किया जा सकता है? MS SQL सर्वर के मामले में, यह कोई समस्या नहीं है - आप INCLUDE विकल्प की मदद से सीधे इंडेक्स में मान शामिल कर सकते हैं।
CREATE INDEX IX_PERSON ON Person ( FirstName, LastName ) INCLUDE(Age)
अब, इस फ़ील्ड का उपयोग अनुक्रमण के दौरान नहीं किया जाता है बल्कि अनुक्रमणिका में शामिल किया जाता है। इस संबंध में हमें किन परेशानियों का सामना करना पड़ सकता है? जब हम किसी निश्चित फ़ील्ड द्वारा किसी तालिका को अनुक्रमित करते हैं, तो डेटाबेस सर्वर को इस फ़ील्ड द्वारा एक इंडेक्स ट्री बनाना चाहिए। इसका मतलब है कि मूल्य बदलते समय हमें इंडेक्स ट्री को बदलना होगा। जब मूल्यों को गहन रूप से संशोधित किया जाता है, तो यह सर्वर के लिए एक समस्याग्रस्त और कठिन कार्य बन जाता है। जब अद्यतन करना बहुत बड़ा हो जाता है, तो कभी-कभी सूचकांक को छोड़ना आसान होता है। अनुक्रमणिका खोज का अत्यधिक अनुकूलन करती है लेकिन सम्मिलित करने, हटाने और अद्यतन करने के कार्यों को नकारात्मक रूप से प्रभावित करती है।
यदि किसी फ़ील्ड को केवल अनुक्रमणिका में शामिल किया जाता है, तो इसका उपयोग अनुक्रमणिका ट्री के निर्माण के दौरान नहीं किया जाता है और यह इसे प्रभावित नहीं करता है, लेकिन इस पेड़ के पत्ते पर मूल्य आसानी से पाया जा सकता है। जब अंतिम और प्रथम नामों की खोज होती है, तो सर्वर पेड़ से सभी प्रथम और अंतिम नामों की खोज करता है, और जब यह पत्ती तक पहुंचता है (आवश्यक अनुक्रमणिका मान पाता है), तो भौतिक स्थान पर सूचक के अलावा पंक्ति मानों में, इसमें अनुक्रमणिका में शामिल फ़ील्ड मान भी शामिल हैं। इसका मतलब है कि लाइन के भौतिक स्थान पर स्विच करने के लिए दूसरा कदम उठाने और वहां से इसे पढ़ने की कोई आवश्यकता नहीं है।
चूंकि आपको आयु डेटा को संशोधित करते समय ट्री को बदलने की आवश्यकता नहीं है, इसलिए यह सभी सामग्री डेटा संशोधन कार्यों को अधिक प्रभावित नहीं करती है। हमें सूचकांक को बदलने की जरूरत नहीं है, हमें सिर्फ पेड़ के पत्ते पर मूल्यों को बदलने की जरूरत है। इसलिए आयु क्षेत्र में बड़े पैमाने पर बदलाव का भी प्रदर्शन पर बहुत अधिक प्रभाव नहीं पड़ेगा। यह निश्चित रूप से प्रभावित करेगा, लेकिन इतना नहीं।
जहाँ तक मुझे पता है, संकुल सूचकांक के मान स्वचालित रूप से लीफ स्तर में शामिल हो जाते हैं, लेकिन इसे विनिर्देशन के साथ जांचा जाना चाहिए।
तो, कब शामिल क्षेत्रों का उपयोग फायदेमंद है? जब वे अक्सर क्वेरी परिणामों में उपयोग किए जाते हैं लेकिन समय-समय पर बदले जाते हैं। एक उदाहरण बैंक लेनदेन की एक तालिका है। ऐसी तालिका में निम्नलिखित फ़ील्ड शामिल हो सकते हैं:खाता संख्या, लेन-देन का प्रकार, दिनांक, राशि। योग द्वारा अनुक्रमणित करने का कोई मतलब नहीं है, लेकिन हम इसे अनुक्रमणिका में शामिल कर सकते हैं और यह क्वेरी को महत्वपूर्ण रूप से गति देगा।
अनुक्रमण से वास्तविक प्रभाव प्राप्त करने के लिए, प्रश्नों को सभी क्षेत्रों का चयन नहीं करना चाहिए, अर्थात हमें तालिका से चयन * के बारे में भूल जाना चाहिए। हमेशा केवल उन्हीं क्षेत्रों की पुनर्गणना करें जिनकी आपको वास्तव में आवश्यकता है। और यदि उनके मान सूचकांक में आते हैं, तो निष्पादन की गति काफी अधिक हो सकती है।
उपयोगी टूल:
डीबीफोर्ज इंडेक्स मैनेजर - एसक्यूएल इंडेक्स की स्थिति का विश्लेषण करने और इंडेक्स विखंडन के साथ मुद्दों को ठीक करने के लिए आसान एसएसएमएस ऐड-इन।