Database
 sql >> डेटाबेस >  >> RDS >> Database

सूचकांक विखंडन को कम करना


यह अच्छा विखंडन नहीं है, या तो

पिछले महीने मैंने अनपेक्षित क्लस्टर इंडेक्स विखंडन के बारे में लिखा था, इसलिए इस बार, मैं कुछ चीजों पर चर्चा करना चाहता हूं जो आप इंडेक्स विखंडन से बचने के लिए कर सकते हैं। मैं मान लूंगा कि आपने पिछली पोस्ट पढ़ ली है और मैं वहां परिभाषित शर्तों से परिचित हूं, और इस पूरे लेख में, जब मैं 'विखंडन' कहता हूं तो मैं तार्किक विखंडन और निम्न पृष्ठ घनत्व समस्याओं दोनों का जिक्र कर रहा हूं।

एक अच्छी क्लस्टर कुंजी चुनें

विखंडन को दूर करने के लिए संचालित करने के लिए सबसे महंगी डेटा संरचना एक तालिका का संकुल सूचकांक है, क्योंकि यह सबसे बड़ी संरचना है क्योंकि इसमें सभी तालिका डेटा शामिल हैं। फ़्रेग्मेंटेशन के नज़रिए से, टेबल इंसर्ट पैटर्न से मेल खाने वाली क्लस्टर कुंजी चुनना समझ में आता है, इसलिए ऐसे पेज पर इंसर्ट होने की कोई संभावना नहीं है, जहां कोई जगह नहीं है और इसलिए पेज स्प्लिट और फ़्रेग्मेंटेशन का कारण बनता है।

किसी भी तालिका के लिए सबसे अच्छी क्लस्टर कुंजी क्या है, यह बहुत बहस का विषय है, लेकिन सामान्य तौर पर आप गलत नहीं होंगे यदि आपकी क्लस्टर कुंजी में निम्नलिखित सरल गुण हैं:

  • संकीर्ण (अर्थात यथासंभव कम कॉलम)
  • स्थिर (यानी आप इसे कभी भी अपडेट नहीं करते)
  • अद्वितीय
  • हमेशा बढ़ती

यह लगातार बढ़ती संपत्ति है जो विखंडन रोकथाम के लिए सबसे महत्वपूर्ण है, क्योंकि यह यादृच्छिक सम्मिलन से बचाती है जो पहले से पूर्ण पृष्ठों पर पृष्ठ विभाजन का कारण बन सकती है। इस तरह की प्रमुख पसंद के उदाहरण हैं इंट आइडेंटिटी और बिगिन्ट आइडेंटिटी कॉलम, या यहां तक ​​कि NEWSEQUENTIALID() फंक्शन से अनुक्रमिक GUID।

इस प्रकार की चाबियों के साथ, नई पंक्तियों में एक महत्वपूर्ण मान होगा जो तालिका में अन्य सभी की तुलना में अधिक होने की गारंटी है, और इसलिए नई पंक्ति का सम्मिलन बिंदु क्लस्टर इंडेक्स संरचना में सबसे दाहिने पृष्ठ के अंत में होगा। अंततः नई पंक्तियाँ उस पृष्ठ को भर देंगी और एक अन्य पृष्ठ अनुक्रमणिका के दाईं ओर जोड़ दिया जाएगा, लेकिन कोई हानिकारक पृष्ठ विभाजन नहीं होगा।

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

वैसे, क्लस्टर कुंजी और उसके सभी प्रभावों को चुनने में अधिक गहन अंतर्दृष्टि के लिए, Kimberly की क्लस्टरिंग कुंजी ब्लॉग श्रेणी देखें (नीचे से ऊपर पढ़ें)।

सूचकांक कुंजी कॉलम अपडेट न करें

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

क्लस्टर इंडेक्स के लिए प्रमुख कॉलम अपडेट से बचना आसान होना चाहिए, क्योंकि यह एक खराब डिज़ाइन है जो टेबल पंक्ति की क्लस्टर कुंजी को अपडेट करने के लिए कहता है। हालांकि गैर-संकुल अनुक्रमणिका के लिए, यह अपरिहार्य है यदि तालिका में अद्यतन उन स्तंभों को शामिल करने के लिए होते हैं जिन पर एक गैर-संकुल अनुक्रमणिका है। उन मामलों के लिए, आपको भरण कारक का उपयोग करना होगा।

चर-लंबाई वाले कॉलम अपडेट न करें

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

इस मामले में विखंडन से बचने के लिए आप कुछ चीजें कर सकते हैं:

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

भरण कारक का उपयोग करें

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

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

आप यहाँ MSDN में भरण कारक सेट करने के बारे में अधिक पढ़ सकते हैं। पूरे उदाहरण के लिए भरण कारक सेट करने के जाल में न पड़ें (sp_configure का उपयोग करके) क्योंकि इसका मतलब है कि सभी अनुक्रमणिका को उस भरण कारक मान का उपयोग करके फिर से बनाया या पुनर्गठित किया जाएगा, यहां तक ​​कि वे अनुक्रमणिका जिनमें कोई विखंडन समस्या नहीं है। आप नहीं चाहते हैं कि आपके बड़े क्लस्टर इंडेक्स, अच्छी बढ़ती-बढ़ती चाबियों के साथ, सभी के पास उनके पत्ते-स्तर के 30% स्थान को यादृच्छिक आवेषण की तैयारी में बर्बाद कर दिया जाए जो कभी नहीं होगा। यह पता लगाना बेहतर है कि कौन से इंडेक्स वास्तव में विखंडन से प्रभावित होते हैं और केवल उनके लिए एक भरण कारक निर्धारित करते हैं।

इसके लिए मैं आपको कोई सही उत्तर या जादुई फॉर्मूला नहीं दे सकता। आम तौर पर स्वीकृत अभ्यास उन अनुक्रमणिकाओं के लिए 70 का भरण कारक (अर्थात् 30% खाली स्थान छोड़ना) है जहां विखंडन एक समस्या है, निगरानी करें कि विखंडन कितनी जल्दी होता है, और फिर भरण कारक या सूचकांक रखरखाव आवृत्ति को संशोधित करें। (या दोनों)।

हां, इसका मतलब है कि आप विखंडन से बचने के लिए जानबूझकर इंडेक्स में जगह बर्बाद कर रहे हैं, लेकिन यह एक अच्छा व्यापार-बंद है कि यह देखते हुए कि पेज विभाजन कितने महंगे हैं और प्रदर्शन के लिए हानिकारक विखंडन कितना हानिकारक हो सकता है। और हाँ, कुछ के कहने के बावजूद, यह तब भी महत्वपूर्ण है जब आप SSD का उपयोग कर रहे हों।

सारांश

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

अब न झुकें और सोचें कि आपको अपने सभी उदाहरणों पर 70 का भरण कारक सेट करना चाहिए - जैसा कि मैंने ऊपर वर्णित किया है, आपको उन्हें सावधानीपूर्वक चुनने और सेट करने की आवश्यकता है।

और SQL संतरी फ़्रेग्मेंटेशन प्रबंधक के बारे में न भूलें, जिसका उपयोग आप (प्रदर्शन सलाहकार के ऐड-ऑन के रूप में) कर सकते हैं ताकि यह पता लगाने में मदद मिल सके कि विखंडन की समस्याएँ कहाँ हैं और फिर उनका समाधान करें। उदाहरण के लिए, इंडेक्स टैब पर, आप आसानी से अपने इंडेक्स को पहले उच्चतम फ़्रेग्मेंटेशन द्वारा सॉर्ट कर सकते हैं (और, यदि आप चाहें, तो पंक्ति गणना कॉलम पर फ़िल्टर लागू करें, अपनी छोटी तालिकाओं को अनदेखा करने के लिए):

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. प्लान एक्सप्लोरर के साथ टिपिंग प्वाइंट की कल्पना करना

  2. वर्चुअल फाइलस्टैट्स क्या करते हैं और क्या नहीं, आपको I/O लेटेंसी के बारे में बताते हैं

  3. Foreach या For – यही सवाल है

  4. टी-एसक्यूएल स्टफ कमांड

  5. QUOTENAME फ़ंक्शन के साथ डायनामिक पिवट टेबल बनाना