पुनर्निर्माण सूचकांक, डीबी अब 10x आकार


13

मेरे पास SQL ​​सर्वर डेटाबेस (2008 R2 SP1) है जो लगभग 15 गिग्स था। यह पता चला है कि रखरखाव थोड़ी देर में नहीं चल रहा था, इसलिए मैंने सभी अनुक्रमणिकाओं के पुनर्निर्माण के लिए एक रखरखाव योजना बनाई, वे बहुत ही खंडित थे।

काम खत्म हो गया और विखंडन दूर हो गया, लेकिन अब डेटाबेस 120 से अधिक है! मैं समझता हूं कि इसने सभी रिबॉल्ड्स को करने के लिए अतिरिक्त स्थान का उपयोग किया होगा, लेकिन अब जब काम किया जाता है, तो मुझे लगता है कि यह सभी स्थान खाली स्थान होगा, लेकिन मुक्त स्थान केवल 3 गिग्स के रूप में दिखाता है, इसलिए 117 गीगा का उपयोग किया जा रहा है हालांकि इंडेक्स पुनर्निर्माण कार्य समाप्त हो गया है।

मैं बहुत भ्रमित हूं और कुछ मार्गदर्शन का उपयोग कर सकता हूं, मेरे पास डीबी को एक उचित आकार में लाने के लिए है, हमारे पास इसके लिए डिस्क स्थान नहीं है।

अग्रिम में धन्यवाद!

यहां पोस्ट किए गए दोनों प्रश्नों के परिणाम हैं:

log_reuse_wait_desc कुछ भी नहीं

name    TotalSpaceInMB  UsedSpaceInMB   FreeSpaceInMB
LIVE_Data   152             123             28
LIVE_Log    18939           89              18849
LIVE_1_Data 114977          111289          3688

तीसरी फ़ाइल एक .ndf फ़ाइल है, जो अप्रयुक्त स्थान में केवल 3688 दिखा रही है, लेकिन 111289 का उपयोग लगभग 15 गीगा डेटा के लिए किया जाता है।

जवाबों:


15

इस बीच मैं सिर्फ यह पता लगाया, कुल मस्तिष्क burp। मैंने संकेत दिया था कि जो मैंने सोचा था कि पुनर्निर्माण कार्य में 90 का एक भरण कारक था, लेकिन इसे "परिवर्तन मुक्त अंतरिक्ष प्रतिशत" के रूप में कहा जाता है, इसलिए वहां 90 के मूल्य का उपयोग करके, मैं वास्तव में 10 के एक भरण कारक का उपयोग कर रहा था !! DOH। कोई आश्चर्य नहीं कि यह 10 गुना बड़ा हो गया। मैं सही भरण कारक के साथ पुनर्निर्माण करने जा रहा हूं फिर सिकुड़ता हूं। हालांकि इनपुट के लिए सभी का धन्यवाद।


1
यह जादूगर सिर्फ भयानक है।
यूएसआर

मुझे पता है, मैं कमांड लाइन के लिए उपयोग किया जाता हूं जहां आप FILL_FACTOR निर्दिष्ट करते हैं और मुफ्त% नहीं चाहते हैं, यह सुसंगत है।

फिर से हटना मत करो, हटना, यह समय की बर्बादी है! अधिक जानकारी के लिए मेरा जवाब देखें।
JNK

1
जेएनके मुझे पता है कि आपके कहने का मतलब पुनर्निर्माण के बाद हटना नहीं है क्योंकि यह सब कुछ फिर से टुकड़े कर देगा। हालाँकि, इस विशेष परिदृश्य में जहां दुर्घटना से जेफ ने हर पृष्ठ पर 90% मुक्त स्थान जोड़ा है, मुझे फिर से अंतरिक्ष को पुनः प्राप्त करने का कोई अन्य तरीका नहीं दिखता है: fillfactor 90 के साथ पुनर्निर्माण, फ़ाइल को हटना, हालांकि आपको एक और पुनर्निर्माण करना होगा फिर से भरने वाले के साथ 90%। या फिर अंतरिक्ष को वापस लाने का एक और तरीका होगा। (अच्छी तरह से शायद एक नया फ़ाइल समूह और फिर नए
फ़ाइल समूह

2

पुनर्निर्माण अनुक्रमणिका DB में अतिरिक्त सुस्त स्थान का कारण बनता है। यह रीइंडेक्सिंग प्रक्रिया का एक प्राकृतिक उप-उत्पाद है - सर्वर वर्तमान संस्करण के साथ सूचकांक के एक नए, उम्मीद से सन्निहित संस्करण का निर्माण कर रहा है, फिर पूर्ण होने पर वर्तमान संस्करण को छोड़ देता है।

रेनडेक्सिंग के बाद सिकुड़ना व्यर्थ है!

आप बस सूचकांक फिर से टुकड़े कर देंगे! श्रिंकिंग डीबी के भीतर डेटा को पुनः प्राप्त करके सुस्त स्थान को हटा देता है।

यहां पॉल रैंडल का एक अच्छा लेख है, जो जब Microsoft में काम कर रहा था DBCC, तो सिकुड़न सहित कोड के प्रभारी थे , इस पर कि आपको क्यों नहीं सिकुड़ना चाहिए।


0

आपको पुनर्निर्माण विकल्प का उपयोग करना चाहिए था SORT_IN_TEMPDB=ON

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

आप इस क्वेरी के साथ उपयोग की गई / मुक्त स्थान स्थिति देख सकते हैं ( यहाँ से लिया गया है ):

use [YourDatabaseNameHere]
go

select
    name,
    cast((size/128.0) as int) as TotalSpaceInMB,
    cast((cast(fileproperty(name, 'SpaceUsed') as int)/128.0) as int) as UsedSpaceInMB,
    cast((size/128.0 - cast(fileproperty(name, 'SpaceUsed') AS int)/128.0) as int) as FreeSpaceInMB
from
    sys.database_files

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


हाँ, यह प्रारूप नहीं होगा, मैं इसे एक क्षण में सवाल से जोड़ दूंगा।

@JeffBane: क्या आप इस जानकारी को अपने प्रश्न में, एक उद्धरण में जोड़ सकते हैं? मैं बाहर नहीं कर सकता कि वहाँ क्या है।
मार्सेल एन।

1
जब एक इंडेक्स का पुनर्निर्माण किया जाता है तो आपको छँटाई के लिए इंडेक्स + 20% के दो बार स्पेस की आवश्यकता होती है। इसलिए सामान्य तौर पर आपके db में हर इंडेक्स को फिर से बनाने के लिए आपको अपने DB में अपने सबसे बड़े इंडेक्स के 120% की आवश्यकता होती है। यदि आप SORT_IN_TEMPDB का उपयोग करते हैं, तो आप केवल 20% जीतते हैं, फिर भी आपको अपनी डेटा फ़ाइल में 100% एक विज्ञापन की आवश्यकता है। इससे भी अधिक, tempdb में सॉर्ट का उपयोग करने से आपका IO लोड बहुत अधिक बढ़ जाता है, क्योंकि इंडेक्स को एक बार लिखने के बजाय डेटाफ़ाइल में, अब आप इसे एक बार tempdb पर लिखते हैं और फिर इसे डेटा फ़ाइल में लिखते हैं। इसलिए यह हमेशा आदर्श नहीं होता है।
एडवर्ड डॉर्टलैंड

-1

किसी भी अन्य विवरण के बिना मुझे संदेह है कि आपको अपने स्थान को पुनः प्राप्त करने से पहले लेनदेन लॉग बैकअप करने की आवश्यकता है।

देखिये क्या select name, log_reuse_wait_desc from sys.databasesबताता है। यदि log_reuse_wait_desc कॉलम कहता है, LOG_BACKUPतो यह तब तक स्थान को पुनः प्राप्त नहीं कर सकता है जब तक कि आपने ट्रांस लॉग का बैकअप नहीं लिया है।


लेन-देन लॉग बैकअप करने की आवश्यकता के कारण कभी भी पृष्ठों को जारी नहीं किया जाएगा।
मर्डनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.