डेटाबेस को सिकोड़ना कब ठीक है?


43

मुझे पता है कि हटना शैतान है: यह पृष्ठ क्रम को उलट देता है और त्वचा कैंसर, डेटा विखंडन और ग्लोबल वार्मिंग के लिए जिम्मेदार है। सूची आगे बढ़ती है ... कहा जा रहा है कि, मेरे पास 100 जीबी डेटाबेस है और मैं 50 जीबी डेटा हटाता हूं - एक टेबल पर नहीं, बल्कि एक डेटाबेस व्यापक स्तर पर पुराने डेटा की सामान्य छंटनी, जिसमें 90% शामिल है। तालिकाओं - यह डेटाबेस को सिकोड़ने के लिए एक उपयुक्त उपयोग के मामले का गठन करता है?

यदि नहीं, तो डेटाबेस से इतने अधिक प्रतिशत डेटा को हटाने के बाद घर को साफ करने के लिए क्या उपयुक्त कदम हैं? मैं दो के बारे में सोच सकता हूं: इंडेक्स और अपडेट स्टैट्स का पुनर्निर्माण करें। और क्या?

जवाबों:


13

एक पुनर्गठित-और-हटना वास्तव में अनुशंसित नहीं है।

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

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

एक अन्य विकल्प यदि आप अनुप्रयोगों को ऑफ़लाइन कर सकते हैं तो सभी डेटा को एक ही संरचना के एक नए डेटाबेस में स्थानांतरित करना है। यदि आपकी निर्माण प्रक्रिया ठोस है, तो आपको उस खाली DB को जल्दी से बनाने में सक्षम होना चाहिए, यदि वर्तमान DB से एक नहीं बनाते हैं (वर्तमान एक के बैकअप को पुनर्स्थापित करें, तालिकाओं में सभी सामग्रियों को काट / हटा दें और एक पूर्ण संकोचन करें)।

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

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

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

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

बेशक, अगर आप एप्स को ऑफलाइन नहीं ले सकते हैं, तो सिर्फ सिकुड़न करना ही आपका एकमात्र विकल्प है, इसलिए अगर आपको वास्तव में उस जगह पर जाने की जरूरत है, तो आप उसे फिर से प्राप्त कर सकते हैं। आपके डेटा, एक्सेस पैटर्न, सामान्य कामकाजी सेट आकार, सर्वर में कितनी रैम है, और इसके आधार पर, अतिरिक्त आंतरिक विखंडन अंत में यह सब महत्वपूर्ण नहीं हो सकता है।

कॉपी ऑपरेशन के लिए, या तो एसएसआईएस या बेस टी-एसक्यूएल ही काम करेगा (एसएसआईएस विकल्प कम कुशल हो सकता है, लेकिन बाद में बनाए रखने के लिए संभवतः आसान है)। यदि आप अनुक्रमणिका के साथ अंत में एफके संबंध बनाते हैं तो आप प्रत्येक तालिका के लिए एक सरल "कॉपी, कॉपी" कर सकते हैं। बेशक एक बंद के लिए, एक हटना + पुनर्गठन शायद ठीक भी है, लेकिन मैं सिर्फ लोगों को नियमित चिंतन पर विचार करने से डराना पसंद करता हूं! (मुझे पता है कि लोग उन्हें रोजाना शेड्यूल करते हैं)।


16

क्या डेटाबेस फिर से विकसित हो रहा है? यदि ऐसा है तो आप जिस सिक्योरिटी ऑपरेशन को करने जा रहे हैं, वह सिर्फ बेकार होने वाला है, क्योंकि जब आप फाइल का साइज डाउन कर देते हैं और फिर आप अधिक डेटा जोड़ते हैं, तो फाइल को फिर से बढ़ना होगा, और लेन-देन के लिए उस वृद्धि के होने की प्रतीक्षा करनी होगी। यदि आपके पास उप-इष्टतम ऑटो-विकास सेटिंग्स और / या एक धीमी ड्राइव है तो यह विकास गतिविधि काफी दर्दनाक होने वाली है।

यदि आप डेटाबेस को सिकोड़ते हैं, तो आप फ्रीड डिस्क स्थान का उपयोग करने जा रहे हैं? यदि आप इस डेटाबेस को फिर से बढ़ने की स्थिति में उस जगह को खाली रखने जा रहे हैं, तो आप बस अपने पहियों को घुमा रहे हैं।

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

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


@ एरॉन बर्ट्रेंड अच्छी तरह से उस बड़ी और डिस्क को प्राप्त करने में 10 साल लग गए क्योंकि मैं इसे ठोस स्थिति पर रखना चाहता हूं। मैं एक 5gb autgrowth के साथ 60gb तक सिकुड़ने के बारे में सोच रहा था। वास्तव में केवल एक चीज जो आप सुझाते हैं, अनुक्रमित, हुह को फिर से बनाना होगा? मुझे लगा कि लोगों के पास कुछ और सिफारिशें होंगी।
bumble_bee_tuna

और मैं केवल पुनर्निर्माण की सिफारिश करूंगा यदि उन्हें इसकी आवश्यकता है। लेकिन मैं इससे पहले कि आप फ़ाइल को सिकोड़ें। वास्तव में मेरे सिर के ऊपर से कुछ भी नहीं सोच सकते हैं कि आप कुछ खाली स्थान है कि सामान्य स्थिति में प्रदर्शन अनुकूलन प्रदान करेगा ... के साथ क्या होता है
हारून बर्ट्रेंड

2

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

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

जब तक आप आमतौर पर 5GB बार-बार बढ़ने की उम्मीद नहीं करेंगे, तब तक मैं 5GB की ऑटो ग्रोथ की सिफारिश नहीं करूंगा। आपको रुक-रुक कर प्रदर्शन की समस्या हो सकती है। आपके डेटा का आकार पहले सेट किया जाना चाहिए जो आपको लगता है कि, एक वर्ष के लिए आवश्यक है, और ऑटो ग्रोथ को ऐसे आकार में सेट किया जाना चाहिए जिसे आपने परीक्षण किया है जो परिचालन प्रदर्शन को प्रभावित नहीं करता है। SQL सर्वर में उस सिकोड़ें डेटाबेस बटन को स्पर्श न करें देखें ! माइक वाल्श द्वारा।

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


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

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

1

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


1

देर से इस WAY पर वापस आ रहा हूँ। फिर भी, हम अपने परीक्षण के वातावरण में सिकुड़न के उपयोग को लंबे समय से करते आ रहे हैं। विषय के अनुसार, ऐसे समय होते हैं जब हटना एक व्यवहार्य विकल्प होता है। लेकिन यह जानना कि कब और कैसे इसे लागू करना है, लंबी और छोटी अवधि में उचित निष्पादन के लिए महत्वपूर्ण हैं।

हमारे परिदृश्य में, हमने हाल ही में अपने बड़े DB में कई बदलाव जोड़े हैं, जिसमें संपीड़न, विभाजन, संग्रह और अनावश्यक पुराने डेटा को हटाना शामिल है। परिणामस्वरूप, हमारी प्राथमिक डेटा फ़ाइल का उपयोग किया गया भाग आधे से भी कम हो गया है जो इसका उपयोग करता था। लेकिन उस सामान के चारों ओर ले जाने की क्या बात है? विशेष रूप से वेब के आसपास के कुछ लेखों के विपरीत, आपके डेटा का आकार BIRUP / RESTORE DURECT के साथ प्रत्यक्ष रूप से सुधार करता है। ऐसा इसलिए है क्योंकि कई लेखों के विपरीत, वास्तविक जीवन परिदृश्यों में आपके द्वारा हटाए गए सामान की तुलना में किसी भी पृष्ठ पर अधिक डेटा लोड होता है।

इस बिंदु पर अधिक, यह सिकुड़ने के लिए एक महान परिदृश्य को खोलता है:

  1. एक स्क्रिप्ट बनाएं जो आपके डेटाबेस में सभी ऑब्जेक्ट्स और उनके फ़ाइलग्रुप को मिल जाएगी (ऑनलाइन बहुत सारे उदाहरण), ड्रॉप क्लॉज़ बनाने के लिए इसका उपयोग करें और साथ ही आपके प्रत्येक सूचकांकों और बाधाओं के लिए परिभाषाएं बनाएं।
  2. एक नई फ़ाइल और फ़ाइल समूह बनाएं, और उसे डिफ़ॉल्ट बनाएं।
  3. सभी गैर-सूचीबद्ध सूचकांक गिराएं (ध्यान दें, कुछ सूचकांक अड़चन हो सकते हैं)।
  4. DROP_EXISTING = ON (जो कि, btw, एक बहुत तेज, न्यूनतम रूप से लॉग किया गया ऑपरेशन है, कई विकल्पों की तुलना में शुरू होता है) के साथ नए फाइलग्रुप पर अपने क्लस्टर किए गए सूचकांक बनाएं।
  5. अपने गैर-सूचीबद्ध सूचकांकों को फिर से बनाएँ।
  6. अंत में, अपनी पुरानी डेटा फ़ाइल (आमतौर पर PRIMINK) पर क्लिक करें।

इस तरह से आपके डेटा में केवल वही डेटा बचा होगा जो आपके DB के सिस्टम ऑब्जेक्ट्स, स्टैटिस्टिक्स, प्रोसेस और व्हाट्सएप पर होगा। हटना अधिक होना चाहिए, बहुत तेजी से, और आपके मुख्य डेटा ऑब्जेक्ट्स पर किसी भी अधिक इंडेक्स मेंटेनेंस की आवश्यकता नहीं है जो बड़े करीने से क्रम में बनाए गए होंगे और भविष्य के विखंडन के लिए न्यूनतम जोखिम होंगे।

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