बड़ी संख्या में पंक्तियों को हटाने के बाद SQL सर्वर डेटाबेस का आकार कम नहीं हुआ।


26

मैं SQL में अच्छा नहीं हूँ, लेकिन मुझे बनाए रखने के लिए एक डेटाबेस मिला है।

इसके लिए लगभग कोई जगह नहीं बची है, इसलिए मैंने वर्ष 2008 के लिए सभी डेटा को हटाने का फैसला किया है। वर्ष 2008 में। डिलीट क्वेरी को निष्पादित करने के बाद (लगभग 10 000 000 पंक्तियों को साफ किया गया था) और सफाई लेनदेन लॉग में मुझे पता चला है कि मेरा क्रियाओं का डेटाबेस आकार पर कोई प्रभाव नहीं था। क्या मुझे कुछ और करना है?

जवाबों:


16

जबकि सिकुड़ना वास्तव में यहाँ वर्णित कारणों के लिए खतरनाक है। जिमबो के जवाब और जॉन के जवाब के बीच एक खुशहाल माध्यम है ... आपको हमेशा गंभीरता से विचार करना चाहिए कि आप अपने डेटाबेस को सिकोड़ना चाहते हैं या नहीं।

एक आदर्श दुनिया में - आप अपने DB को विकसित करने के लिए बहुत सारी खाली जगह बनायेंगे। मैं इस "राइट साइज़िंग" को आपका डेटाबेस कहता हूं। आप इस खाली जगह को वहीं रहने देंगे और इसे वापस देने का प्रयास नहीं करेंगे और अपने कुल आकार को अपने उपयोग किए गए आकार पर ही रखेंगे .. क्यों? क्योंकि आपका डेटाबेस अंततः फिर से बढ़ेगा .. फिर आप फिर से सिकुड़ेंगे .. और आप बेकार के सिकुड़ के इस भयानक पैटर्न में फंस जाएंगे, इसके बाद वृद्धि होगी - और पूरे समय, जैसा कि कुछ ने बताया है, आप होंगे अपने सूचकांक विखंडन में वृद्धि।

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

यदि आप भविष्य में सामान्य उपयोग और विकास पैटर्न के माध्यम से उस स्थान को वापस डीबी में जोड़ने की योजना बनाते हैं, तो आप बस उस स्थान को छोड़ना चाहते हैं।

भी आपने कहा कि आपने अपना लेन-देन लॉग "क्लियर" कर लिया है। मुझे यह जानने के लिए उत्सुक होना चाहिए कि आपने यह कैसे किया, लेकिन जैसा कि आपने मेरे द्वारा साझा की गई पोस्ट को पढ़ा है और श्रृंखला के अन्य लोगों ने आपको लेन-देन प्रबंधन पर कुछ सुझाव दिए हैं। लेकिन संक्षेप में - यदि आप पूर्ण पुनर्प्राप्ति मोड में हैं, तो आपको लॉग को पुन: उपयोग करने के लिए नियमित लॉग बैकअप लेना चाहिए। अन्यथा - पूर्ण मोड में रहते हुए कोई लॉग बैकअप के साथ - लॉग फ़ाइल बढ़ती और बढ़ती रहती है और बढ़ती रहती है और जो आपने किया है उसे हमेशा बचाता है क्योंकि आपने एसक्यूएल को बताया था कि आप क्रैश रिकवरी के लिए उस लॉग को बनाए रखना नहीं चाहते हैं, लेकिन एक रखना चाहते हैं पुनर्प्राप्ति उद्देश्यों के लिए समय में एक विशिष्ट बिंदु पर पुनर्प्राप्त करने के लिए लेनदेन / पूर्ववत लेनदेन को फिर से चलाने के लिए इसका मैन्युअल बैकअप ... यदि आप सरल हैं और लॉग को अत्यधिक बढ़ते हुए देखते हैं,BEGIN TRAN ... do work.... COMMIT TRANया क्या आपने अभी एक बड़ा DELETEबयान जारी किया है और एक निहित लेनदेन में डेटा की पूरी गड़बड़ी को हटा दिया है। '

मैं यह भी मान रहा हूं कि आप अपने फाइल सिस्टम पर इस खाली जगह की तलाश कर रहे हैं। यदि आप इसे SQL के भीतर और उस बड़ी फ़ाइल के भीतर देख रहे हैं - तो ऐसा हो सकता है कि आप अपने ऑपरेशन के तुरंत बाद अगर आप भूत सफाई का इंतजार कर रहे हैं तो पूरा हो जाए। भूत सफाई के बारे में पॉल रान्डल ब्लॉग


9

डेटाबेस में पंक्तियों को हटाने से वास्तविक डेटाबेस फ़ाइल का आकार कम नहीं होगा।

पंक्ति विलोपन के बाद आपको डेटाबेस को संक्षिप्त करना होगा।

SQL सर्वर 2005 DBCC SHRINKDATABASE (लेनदेन-SQL)

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

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


4

अपने DATABASE पर ध्यान न दें!

"ऐसा क्यों होता है? एक डेटा फ़ाइल हटना ऑपरेशन एक बार में एक ही फ़ाइल पर काम करता है, और GAM बिटमैप्स का उपयोग करता है (स्टोरेज इंजन के अंदर देखें: GAM, SGAM, PFS और अन्य आवंटन नक्शे) में आवंटित किए गए उच्चतम पृष्ठ को खोजने के लिए फ़ाइल। इसके बाद इसे फ़ाइल के सामने की ओर ले जा सकते हैं, और इसी तरह, और इसी तरह। ऊपर के मामले में, यह पूरी तरह से खंडित से इसे ले लिया, पूरी तरह से खंडित सूचकांक के आदेश को उलट दिया। "

http://www.sqlskills.com/BLOGS/PAUL/post/Why-you-should-not-shrink-your-data-files.aspx

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

http://blog.sqlauthority.com/2011/01/19/sql-server-shrinking-database-is-bad-increases-fragmentation-reduces-performance/


1
आपको डेटा को एक नई फ़ाइल समूह में ले जाना चाहिए फिर पुरानी फ़ाइल समूह को हटा दें। इस तरह से आपको कोई विखंडन नहीं होता है और आप अपने डेटाबेस को छोटा कर सकते हैं।
अली रज़ेघी

2

जब आप डेटा हटाते हैं, तो SQL सर्वर नए डेटा डालने के लिए बाद में उपयोग के लिए अपना स्थान सुरक्षित रखता है। आपको डेटाबेस को सिकोड़ने की आवश्यकता है। आप अधिक जानकारी यहाँ पा सकते हैं ।


1

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


0

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

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