2011-02-15 18 views
6

में अप्रयुक्त स्थान को पुनः प्राप्त मैं, 300,000 से अधिक रिकॉर्ड के साथ एक मेज है आकार लगभग 1.5 जीबीएसक्यूएल सर्वर 2008

कि तालिका में की मैं तीन varchar(5000) फ़ील्ड हैं, बाकी छोटे क्षेत्र हैं।

update जारी करने में, उन तीन फ़ील्ड को '' पर सेट करना।

एक छोटा (डेटाबेस और फ़ाइलें) डेटाबेस से पहले के रूप में लगभग एक ही स्थान का उपयोग करता करने के बाद ...

DBCC SHRINKDATABASE(N'DataBase') 
DBCC SHRINKFILE (N'DataBase' , 1757) 
DBCC SHRINKFILE (N'DataBase_log' , 344) 

कैसे है कि डिस्क स्थान को पुनः प्राप्त करने पर कोई भी विचार?

उत्तर

3

अनिवार्य रूप से, आपको हार्ड ड्राइव पर दूसरे स्थान पर तालिका की सामग्री को "स्थानांतरित" करना होगा। जब ऐसा स्थानांतरित हो जाता है, तो एसक्यूएल पृष्ठों की सामग्री को कुशलता से "दोबारा" कर देगा। 3 (या 0 और एक फ्लिप नल बिटमैस्क) के साथ डेटा के 5000 बाइट्स को प्रतिस्थापित करने से एसक्यूएल को तालिका के पृष्ठों की सामग्री को संशोधित या फिर से लिखने का कारण नहीं होगा।

यदि तालिका में क्लस्टर्ड इंडेक्स है, तो बस इसे पुनः संशोधित करें (वैकल्पिक INDEX ... पुनर्निर्मित ...) चाल करेगा।

यदि तालिका में क्लस्टर्ड इंडेक्स नहीं है, तो आप या तो एक बना सकते हैं और फिर इसे छोड़ सकते हैं, या चयन कर सकते हैं ... में ... एक नई टेबल, पुरानी तालिका ड्रॉप करें, और मूल को नया नाम बदलें नाम।

+0

हां, "सामग्री को ले जाएं" जवाब है, क्लस्टर इंडेक्स को बदलना एक अच्छी टिप है, मैंने डेटाबेस की संरचना को बदल दिया है (एसक्यूएल मैनेजर एक बूंद बनाता है और स्क्रिप्ट को फिर से बना देता है ...) – opensas

0

मैं सिर्फ शून्य पर उन क्षेत्रों स्थापित करने के लिए, इस मुद्दे छोटा किया है, और फिर उन्हें स्थापित करने के लिए ''

और db 115 एमबी

बहुत अजीब 1.5 जीबी से चला गया ...

-

वास्तव में

, उन क्षेत्रों की स्थापना सिर्फ इसलिए कि आप स्तंभ की स्थापना की पूरी टेबल चाल

+0

सुनिश्चित नहीं है कि यह कोई फर्क पड़ता है लेकिन क्या आपकी तालिका एक ढेर है या क्या इसमें क्लस्टर्ड इंडेक्स है? –

2

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

इसके अलावा, आप जानते हैं, क्या नहीं, वो वर्कर (5000) का मतलब यह नहीं है कि इसमें 5000 ऑक्टेट्स लगते हैं? यह परिवर्तनीय लंबाई है - एक दो-ऑक्टेट लंबाई उपसर्ग जिसमें फ़ील्ड की डेटा लंबाई होती है, उसके बाद डेटा ऑक्टेटक्ट होता है। एक पंक्ति में एक वर्चर (5000) कॉलम को 'फूओबर' में सेट करने के लिए 8 ऑक्टेट्स स्पेस (2 + 6) की आवश्यकता होगी।

क्लस्टरिंग इंडेक्स समेत अपने सूचकांक दोबारा बनाएं।

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

अब जब आप डेटाफाइल को कम करते हैं, तो आपको कुछ डिस्क स्थान पुनः प्राप्त करना चाहिए।

+0

हाँ, मुझे पता है कि वर्चर परिवर्तनीय है ... यही कारण है कि मैं एक वर्चर फ़ील्ड खाली करने के लिए टेबल आकार को कम करने के लिए पर्याप्त होना चाहिए ... – opensas