मुझे अनुक्रमित का पुनर्निर्माण कब करना चाहिए?


56

मुझे अपने रिलेशनल डेटाबेस (SQL सर्वर) में अनुक्रमणिकाओं का पुनर्निर्माण कब करना चाहिए?

क्या नियमित आधार पर अनुक्रमित के पुनर्निर्माण के लिए कोई मामला है?


जवाबों:


41

मेरे जवाब में बहुत सामान्य होने के जोखिम पर, मैं कहूंगा कि आपको नियमित रूप से एक अनुरक्षण रखरखाव प्रक्रिया को चलाना चाहिए। हालाँकि, आपकी अनुरक्षण अनुरक्षण प्रक्रिया को केवल उन अनुक्रमणिकाओं का पुनर्निर्माण / पुनर्गठन करना चाहिए जिनकी विशेष रूप से आवश्यकता होती है।

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

SQL सर्वर के लिए बोलते हुए, मैं एक सूचकांक आकार और सूचकांक विखंडन स्तर का चयन करता हूं जिस बिंदु पर मैं सूचकांक रखरखाव करना शुरू करता हूं। यदि किसी इंडेक्स में 100 से कम पृष्ठ हैं, तो मैं कोई रखरखाव नहीं करूँगा।

यदि कोई सूचकांक 10% से 30% के बीच है, तो मैं REORGANIZEसूचकांक और UPDATEआँकड़ों को लिखूंगा। यदि कोई सूचकांक ३०% से अधिक खंडित है, तो मैं REBUILDसूचकांक करूंगा - नहीं के साथ UPDATE STATISTICS, क्योंकि इस पर ध्यान दिया जाता है REBUILD। हालांकि याद रखें कि एक पुनर्निर्माण केवल सूचकांक के साथ सीधे जुड़े ऑब्जेक्ट ऑब्जेक्ट को अपडेट करता है। अन्य स्तंभ आँकड़ों को अलग से बनाए रखने की आवश्यकता होगी।

यह उत्तर वास्तव में कहने का सिर्फ एक लंबा रास्ता है: हाँ, आपको नियमित अनुरक्षण अनुरक्षण करना चाहिए, लेकिन केवल उन अनुक्रमणिकाओं पर जिनकी आवश्यकता है।


19

मुझे अपने संबंधपरक डेटाबेस (जैसे SQL सर्वर) में अनुक्रमणिकाओं का पुनर्निर्माण कब करना चाहिए?

जब आप विशेष घटनाओं से अत्यधिक खंडित हो जाते हैं तो आपको अनुक्रमितों को फिर से बनाना चाहिए। उदाहरण के लिए, आप डेटा का एक बड़ा, भारी भार एक अनुक्रमित तालिका में करते हैं।

क्या नियमित आधार पर अनुक्रमित के पुनर्निर्माण के लिए कोई मामला है?

तो क्या होगा यदि नियमित गतिविधि के कारण आपके सूचकांक नियमित आधार पर खंडित हो रहे हैं? क्या आपको नियमित रूप से रेकॉर्ड्स शेड्यूल करने चाहिए? उन्हें कितनी बार चलाना चाहिए?

टॉम Kyte , इस क्लासिक में टॉम धागा पूछो , सिफारिश करता है:

अनुक्रमणिका पुनर्वित्त के बीच का समय अंतराल लगभग हमेशा होना चाहिए।

...

पता नहीं इसे बेहतर कैसे कहें - अतिरिक्त स्थान के साथ सूचकांक बड़ा और मोटा होना चाहता है। यह आपके द्वारा अपडेट किए जाने वाले एक कॉलम पर है - इंडेक्स प्रविष्टि को इंडेक्स में एक जगह से दूसरी जगह ले जाना। एक दिन पंक्ति में "ए" का कोड होता है, अगले दिन कोड "जी", फिर "जेड" और फिर "एच" और इसी तरह का एक कोड होता है। इसलिए पंक्ति के लिए अनुक्रमणिका प्रविष्टि स्थान से दूसरे स्थान पर जाती है। जैसा कि यह ऐसा करता है, इसे स्थान की आवश्यकता होती है - यदि अंतरिक्ष नहीं है, तो हम ब्लॉक को दो में विभाजित करते हैं - और स्थान बनाते हैं। अब सूचकांक मोटा हो रहा है। समय के साथ सूचकांक 2-3x होता है, जब आप इसे शुरू करते थे और "आधा या अधिक खाली" होता है, लेकिन यह ठीक है क्योंकि आप पंक्तियों को चारों ओर ले जाते हैं। अब जब हम पंक्तियों को चारों ओर ले जाते हैं, तो हमें कमरे बनाने के लिए ब्लॉकों को विभाजित नहीं करना पड़ता है - कमरा पहले से ही उपलब्ध है।

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

आपने कोई स्थान नहीं बचाया।

सूचकांक ठीक उसी तरह से है जैसा वह था।

आप बस इसे फिर से बनाने के लिए अपना समय बर्बाद कर रहे होंगे जिससे यह दुष्चक्र अपने आप को दोहराएगा।

यहाँ तर्क ध्वनि है, लेकिन यह एक रीड-हैवी लोड प्रोफाइल के खिलाफ पक्षपाती है।

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

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


11

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


प्रिय पाठकों के लिए बस एक FYI करें कि SQLFool की स्क्रिप्ट> 5 वर्षों में अपडेट नहीं की गई है, इसलिए हो सकता है कि जब यह अपनी बात करे तो इसमें नई घंटियाँ और सीटी शामिल न हों।
लोवलीडीबीए

वास्तव में, मुझे विश्वास है कि पिछली बार जब मैंने साइट की जाँच की थी (अब उस तक नहीं पहुँच सकता (एक अच्छा संकेत नहीं हो सकता है)), मिशेल अब SQL सर्वर में सक्रिय रूप से काम नहीं कर रही थी, और आगे स्क्रिप्ट पर काम करने का कोई सक्रिय इरादा नहीं था। । अगर यह तुम्हारे लिए काम कर रहा है, महान! नए इंस्टॉलेशन के लिए, ओला हैलेनग्रेन की स्क्रिप्ट पर विचार करें : मैंने दोनों का उपयोग किया है, और यह एक कठिन संक्रमण नहीं है।
RDFozz

7

जैसा कि मैट एम के स्वीकृत उत्तर में उल्लेख किया गया है, अंगूठे का एक सामान्य नियम यह है कि 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

1
यह एक उत्तर प्रदान नहीं करता है। सवाल यह नहीं है कि मैं "x" संपीड़न के साथ अनुक्रमणिका कैसे ढूंढता हूं, यह "जब मुझे अनुक्रमित करना चाहिए"।
मैक्स वर्नोन

1
यह प्रश्न का उत्तर प्रदान नहीं करता है। एक बार आपके पास पर्याप्त प्रतिष्ठा होने पर आप किसी भी पोस्ट पर टिप्पणी करने में सक्षम होंगे ; इसके बजाय, ऐसे उत्तर प्रदान करें जिन्हें पूछने वाले से स्पष्टीकरण की आवश्यकता न हो । - समीक्षा से
नीच डीबीए

2
@LowlyDBA - यह थोड़ा संक्षिप्त हो सकता है, लेकिन मुझे लगता है कि यह सवाल का जवाब देता है, और चर्चा के लिए कुछ उपयोगी प्रदान करता है। मैंने इसे विस्तार से बताया है कि कैसे। अमांडा - यदि मेरा संपादन गलत लगता है, तो कृपया इसे वापस रोल करने के लिए स्वतंत्र महसूस करें!
RDFozz

धन्यवाद RDFozz। अछा लगता है। हां, 30% से अधिक खंडित पुनर्निर्माण का समय है।
amandamaddox3

5

मुझे अनुक्रमित का पुनर्निर्माण कब करना चाहिए?

जब सूचकांक विखंडन प्रतिशत 30% से अधिक है।

क्या नियमित आधार पर अनुक्रमित के पुनर्निर्माण के लिए कोई मामला है?

ऐसा कोई मामला नहीं है, लेकिन सामान्य तौर पर, सप्ताह में एक बार सूचकांक अनुरक्षण करना, पर्यावरण को स्थिर रखने के लिए सप्ताहांत में सबसे अच्छा अभ्यास है।

मैं Ola Hallengren (सबसे अच्छी रखरखाव लिपियों) से रखरखाव लिपियों का उपयोग करने की सलाह दूंगा, अपने वातावरण के आधार पर स्क्रिप्ट को अनुकूलित करूँगा और उन्हें सप्ताहांत पर चलाने के लिए शेड्यूल करूंगा।

https://ola.hallengren.com/

नोट: कृपया अनुक्रमणिकाओं के पुनर्निर्माण के बाद आँकड़े अद्यतन करना न भूलें, क्योंकि अनुक्रमणिकाएँ पुन: निर्माण सभी आँकड़ों को अद्यतन नहीं करती हैं।


मुझे पूरा यकीन है कि आपका नोट गलत है। एक अनुक्रमणिका पुनर्निर्माण आँकड़ों को अद्यतन करता है। एक सूचकांक पुनर्गठन नहीं करता है। हालांकि यह केवल इंडेक्स से संबंधित वस्तुओं के लिए सांख्यिकी को अपडेट करता है, सभी आंकड़ों को नहीं। कहा जा रहा है, मैं पुराने आंकड़ों के कारण पैरामीटर सूँघने और खराब क्वेरी योजनाओं के कारण मंदी की संभावना को कम करने के लिए अक्सर आंकड़ों को अपडेट करने की सलाह देता हूं।
bmg002

1

आईटी में अधिकांश चीजों के साथ, यह निर्भर करता है। अनुक्रमणिका का पुनर्निर्माण करके आप किस समस्या को ठीक करने का प्रयास कर रहे हैं? क्या आप दिखा सकते हैं कि यह वास्तव में समस्या को ठीक करता है? यदि ऐसा है, तो समस्या को ठीक करने के लिए आपको कम से कम रखरखाव की आवश्यकता होने तक संख्याओं को ट्विक करें।

यदि यह समस्या को ठीक नहीं करता है, या आप जो कारण कर रहे हैं, वह सिर्फ कुछ मीट्रिक को अपील करने के लिए है जिसे आप मॉनिटर करते हैं क्योंकि इससे चीजें बेहतर हो सकती हैं, तो आप जो कुछ कर रहे हैं वह सीपीयू और आईओ जल रहा है और संभवतः आपकी समस्या को और बदतर बना सकता है।

एक तर्क है कि विखंडन को ठीक करने से आपके सर्वर पर कोई फर्क नहीं पड़ेगा, तो क्या यह नियमित रूप से करने के लायक है?

https://www.brentozar.com/archive/2017/12/index-maintenance-madness/

http://brentozar.com/go/defrag

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.