जवाबों:
मेरे जवाब में बहुत सामान्य होने के जोखिम पर, मैं कहूंगा कि आपको नियमित रूप से एक अनुरक्षण रखरखाव प्रक्रिया को चलाना चाहिए। हालाँकि, आपकी अनुरक्षण अनुरक्षण प्रक्रिया को केवल उन अनुक्रमणिकाओं का पुनर्निर्माण / पुनर्गठन करना चाहिए जिनकी विशेष रूप से आवश्यकता होती है।
यह प्रश्न प्रस्तुत करता है: एक सूचकांक को फिर से बनाने या पुनर्गठित करने की आवश्यकता कब होती है? रोलांडो ने इस पर अच्छी तरह से छुआ। फिर से, मैं अत्यधिक व्यापक होने का जोखिम उठाता हूं। एक सूचकांक को रखरखाव की आवश्यकता होती है जब विखंडन स्तर प्रदर्शन पर प्रतिकूल प्रभाव डालता है। विखंडन का यह स्तर सूचकांक के आकार और संरचना के आधार पर भिन्न हो सकता है।
SQL सर्वर के लिए बोलते हुए, मैं एक सूचकांक आकार और सूचकांक विखंडन स्तर का चयन करता हूं जिस बिंदु पर मैं सूचकांक रखरखाव करना शुरू करता हूं। यदि किसी इंडेक्स में 100 से कम पृष्ठ हैं, तो मैं कोई रखरखाव नहीं करूँगा।
यदि कोई सूचकांक 10% से 30% के बीच है, तो मैं REORGANIZE
सूचकांक और UPDATE
आँकड़ों को लिखूंगा। यदि कोई सूचकांक ३०% से अधिक खंडित है, तो मैं REBUILD
सूचकांक करूंगा - नहीं के साथ UPDATE STATISTICS
, क्योंकि इस पर ध्यान दिया जाता है REBUILD
। हालांकि याद रखें कि एक पुनर्निर्माण केवल सूचकांक के साथ सीधे जुड़े ऑब्जेक्ट ऑब्जेक्ट को अपडेट करता है। अन्य स्तंभ आँकड़ों को अलग से बनाए रखने की आवश्यकता होगी।
यह उत्तर वास्तव में कहने का सिर्फ एक लंबा रास्ता है: हाँ, आपको नियमित अनुरक्षण अनुरक्षण करना चाहिए, लेकिन केवल उन अनुक्रमणिकाओं पर जिनकी आवश्यकता है।
मुझे अपने संबंधपरक डेटाबेस (जैसे SQL सर्वर) में अनुक्रमणिकाओं का पुनर्निर्माण कब करना चाहिए?
जब आप विशेष घटनाओं से अत्यधिक खंडित हो जाते हैं तो आपको अनुक्रमितों को फिर से बनाना चाहिए। उदाहरण के लिए, आप डेटा का एक बड़ा, भारी भार एक अनुक्रमित तालिका में करते हैं।
क्या नियमित आधार पर अनुक्रमित के पुनर्निर्माण के लिए कोई मामला है?
तो क्या होगा यदि नियमित गतिविधि के कारण आपके सूचकांक नियमित आधार पर खंडित हो रहे हैं? क्या आपको नियमित रूप से रेकॉर्ड्स शेड्यूल करने चाहिए? उन्हें कितनी बार चलाना चाहिए?
टॉम Kyte , इस क्लासिक में टॉम धागा पूछो , सिफारिश करता है:
अनुक्रमणिका पुनर्वित्त के बीच का समय अंतराल लगभग हमेशा होना चाहिए।
...
पता नहीं इसे बेहतर कैसे कहें - अतिरिक्त स्थान के साथ सूचकांक बड़ा और मोटा होना चाहता है। यह आपके द्वारा अपडेट किए जाने वाले एक कॉलम पर है - इंडेक्स प्रविष्टि को इंडेक्स में एक जगह से दूसरी जगह ले जाना। एक दिन पंक्ति में "ए" का कोड होता है, अगले दिन कोड "जी", फिर "जेड" और फिर "एच" और इसी तरह का एक कोड होता है। इसलिए पंक्ति के लिए अनुक्रमणिका प्रविष्टि स्थान से दूसरे स्थान पर जाती है। जैसा कि यह ऐसा करता है, इसे स्थान की आवश्यकता होती है - यदि अंतरिक्ष नहीं है, तो हम ब्लॉक को दो में विभाजित करते हैं - और स्थान बनाते हैं। अब सूचकांक मोटा हो रहा है। समय के साथ सूचकांक 2-3x होता है, जब आप इसे शुरू करते थे और "आधा या अधिक खाली" होता है, लेकिन यह ठीक है क्योंकि आप पंक्तियों को चारों ओर ले जाते हैं। अब जब हम पंक्तियों को चारों ओर ले जाते हैं, तो हमें कमरे बनाने के लिए ब्लॉकों को विभाजित नहीं करना पड़ता है - कमरा पहले से ही उपलब्ध है।
फिर आप साथ आते हैं और सूचकांक को फिर से बनाते या छोड़ते हैं और (जो समान प्रभाव रखते हैं - बस पुनर्निर्माण "सुरक्षित" है - सूचकांक को खोने का एक मौका नहीं खड़ा करता है और तेजी से हो सकता है क्योंकि सूचकांक फिर से बनाया जा सकता है टेबल को स्कैन करने और एक ताज़ा इंडेक्स बनाने के बजाय मौजूदा इंडेक्स को स्कैन करना)। अब, वह सब अच्छा स्थान चला गया है। हम फिर से सभी ब्लॉकों को विभाजित करने की प्रक्रिया शुरू करते हैं - हमें वापस वहीं मिल रहा है जहां हमने शुरू किया था।
आपने कोई स्थान नहीं बचाया।
सूचकांक ठीक उसी तरह से है जैसा वह था।
आप बस इसे फिर से बनाने के लिए अपना समय बर्बाद कर रहे होंगे जिससे यह दुष्चक्र अपने आप को दोहराएगा।
यहाँ तर्क ध्वनि है, लेकिन यह एक रीड-हैवी लोड प्रोफाइल के खिलाफ पक्षपाती है।
एक "वसा" सूचकांक (बहुत सारे अंतराल के साथ) वास्तव में नए और स्थानांतरित पंक्तियों के लिए एक अच्छी मात्रा में कमरे में रहता है, इस प्रकार पृष्ठ विभाजन को कम करता है और आपके लेखन को तेज रखता है। हालाँकि, जब आप उस वसा सूचकांक से पढ़ते हैं, तो आपको एक ही डेटा प्राप्त करने के लिए अधिक पृष्ठ पढ़ने होंगे क्योंकि आप अब अधिक खाली स्थान से गुजर रहे हैं। यह आपके रीड को धीमा कर देता है।
इसलिए, रीड-हैवी डेटाबेस में आप नियमित रूप से अपने इंडेक्स का पुनर्निर्माण या पुनर्गठन करना चाहते हैं। (कितनी बार और किन शर्तों के तहत? मैट एम के पास पहले से ही इस सवाल का एक ठोस जवाब है।) डेटाबेस में जो लगभग बराबर पढ़ने और लिखने की गतिविधि का अनुभव करते हैं, या डेटाबेस में जो लिखने में भारी होते हैं, आप संभवतः अनुक्रमणिका अनुक्रमित करके अपने डेटाबेस के प्रदर्शन को नुकसान पहुंचा रहे हैं। नियमित तौर पर।
अधिकांश लोग उन्हें नियमित आधार पर पुनर्निर्माण करते हैं ताकि वे कभी खंडित न हों। जब आपको उनके पुनर्निर्माण की आवश्यकता होती है, तो यह इस पर आधारित होता है कि वे कितनी जल्दी खंडित हो जाते हैं। कुछ अनुक्रमितों को अक्सर पुनर्निर्माण करना होगा, अन्य मूल रूप से कभी नहीं। SQLFool एक साथ रखी गई स्क्रिप्ट की जाँच करें जो आपके लिए इस सामान का पता लगाने में बहुत काम करती है।
जैसा कि मैट एम के स्वीकृत उत्तर में उल्लेख किया गया है, अंगूठे का एक सामान्य नियम यह है कि 30% से अधिक खंडित होने वाले अनुक्रमितों को फिर से बनाया जाना चाहिए।
यह क्वेरी आपको यह पता लगाने में मदद करेगी कि आपके पास कितने सूचकांक हैं जो 30% से अधिक खंडित हैं (जब आपके पास कुछ है, तो आपको उन्हें फिर से बनाना चाहिए):
SELECT DB_NAME() AS DBName,
OBJECT_NAME(ind.object_id) AS TableName,
ind.name AS IndexName,
indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent,
indexstats.fragment_count,
indexstats.avg_fragment_size_in_pages,
SUM(p.rows) AS Rows
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.indexes AS ind ON ( ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id)
INNER JOIN sys.partitions AS p ON ( ind.object_id = p.object_id
AND ind.index_id = p.index_id)
WHERE indexstats.avg_fragmentation_in_percent > 30
GROUP BY
OBJECT_NAME(ind.object_id),
ind.name,
indexstats.index_type_desc,
indexstats.avg_fragmentation_in_percent,
indexstats.fragment_count,
indexstats.avg_fragment_size_in_pages
ORDER BY indexstats.avg_fragmentation_in_percent DESC
मुझे अनुक्रमित का पुनर्निर्माण कब करना चाहिए?
जब सूचकांक विखंडन प्रतिशत 30% से अधिक है।
क्या नियमित आधार पर अनुक्रमित के पुनर्निर्माण के लिए कोई मामला है?
ऐसा कोई मामला नहीं है, लेकिन सामान्य तौर पर, सप्ताह में एक बार सूचकांक अनुरक्षण करना, पर्यावरण को स्थिर रखने के लिए सप्ताहांत में सबसे अच्छा अभ्यास है।
मैं Ola Hallengren (सबसे अच्छी रखरखाव लिपियों) से रखरखाव लिपियों का उपयोग करने की सलाह दूंगा, अपने वातावरण के आधार पर स्क्रिप्ट को अनुकूलित करूँगा और उन्हें सप्ताहांत पर चलाने के लिए शेड्यूल करूंगा।
नोट: कृपया अनुक्रमणिकाओं के पुनर्निर्माण के बाद आँकड़े अद्यतन करना न भूलें, क्योंकि अनुक्रमणिकाएँ पुन: निर्माण सभी आँकड़ों को अद्यतन नहीं करती हैं।
आईटी में अधिकांश चीजों के साथ, यह निर्भर करता है। अनुक्रमणिका का पुनर्निर्माण करके आप किस समस्या को ठीक करने का प्रयास कर रहे हैं? क्या आप दिखा सकते हैं कि यह वास्तव में समस्या को ठीक करता है? यदि ऐसा है, तो समस्या को ठीक करने के लिए आपको कम से कम रखरखाव की आवश्यकता होने तक संख्याओं को ट्विक करें।
यदि यह समस्या को ठीक नहीं करता है, या आप जो कारण कर रहे हैं, वह सिर्फ कुछ मीट्रिक को अपील करने के लिए है जिसे आप मॉनिटर करते हैं क्योंकि इससे चीजें बेहतर हो सकती हैं, तो आप जो कुछ कर रहे हैं वह सीपीयू और आईओ जल रहा है और संभवतः आपकी समस्या को और बदतर बना सकता है।
एक तर्क है कि विखंडन को ठीक करने से आपके सर्वर पर कोई फर्क नहीं पड़ेगा, तो क्या यह नियमित रूप से करने के लायक है?
https://www.brentozar.com/archive/2017/12/index-maintenance-madness/