मेरे पास 5M और 1.5G के बीच पंक्तियों की मात्रा के साथ कई टेबल हैं
प्रत्येक तालिका में अपना BLOB फ़ील्ड होता है, जिसका आकार 100 बाइट्स से 30 एमबीटी तक भिन्न होता है और जिसे 'बड़े मूल्य प्रकारों में से पंक्ति' = ON के रूप में संग्रहीत किया जाता है
टेबल्स को अलग-अलग फाइलग्रुप में 3-4 फाइलों के साथ अलग-अलग डिस्क पर # अलग-अलग LUNs @ बहुत तेज सैन में संग्रहित किया जाता है
हर दिन ये टेबल 5-100 जीबी आकार में और 600k - 1.5M पंक्तियों के साथ बढ़ते हैं
समय की निश्चित मात्रा के बाद , जो 2 सप्ताह से 6 महीने तक भिन्न होती है, कुछ पंक्तियों को हटा दिया जाता है या डीबी को संग्रहित करने के लिए स्थानांतरित किया जाता है, इसलिए - 6 महीने से पुराने वर्कटेबल्स में कोई भी पंक्तियां नहीं हैं।
सर्वर का वर्तमान विन्यास:
- SQL सर्वर इंजन 2008 R2 SP1 एंटरप्राइज़ @ 24 कोर, @ 64 GB RAM है
- SQL सर्वर अतिरिक्त स्टार्टअप झंडे के साथ चलता है:
-टी 3640; (संग्रहीत कार्यविधि में प्रत्येक कथन के लिए क्लाइंट के लिए DONE_IN_PROC संदेश भेजना समाप्त कर देता है। यह सेट नोवस ऑन के सत्र सेटिंग के समान है, लेकिन जब ट्रेस ध्वज के रूप में सेट किया जाता है, तो प्रत्येक क्लाइंट सत्र को इस तरह से संभाला जाता है)
-T 1118; (एक बार में (पहले 8 पृष्ठों के लिए) एक सीमा तक अस्थायी रूप से अस्थायी रूप से आवंटन आवंटित किए जाते हैं।)
-T 2301; (उन्नत ऑप्टिमाइज़ेशन सक्षम करता है जो निर्णय समर्थन के लिए विशिष्ट होते हैं। यह विकल्प बड़े डेटा सेट के निर्णय समर्थन प्रसंस्करण पर लागू होता है)
-T 1117; (एक बार में सभी डेटा फ़ाइलों को बढ़ा देता है, अन्यथा यह बदल जाता है।)
-इ; (एक फ़ाइलग्रुप में प्रत्येक फ़ाइल के लिए आवंटित किए गए अंशों की संख्या को बढ़ाता है। यह विकल्प उन डेटा वेयरहाउस एप्लिकेशनों के लिए मददगार हो सकता है, जिनके पास सीमित संख्या में इंडेक्स या डेटा स्कैन चलाने वाले उपयोगकर्ता हैं)
-टी 834; (SQL सर्वर को बफ़र पूल, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft के लिए आवंटित की गई मेमोरी के लिए Windows बड़े पृष्ठ के आवंटन का उपयोग करने का कारण बनता है। कॉम / केबी / 920093 )
- SQL सर्वर बड़े पृष्ठ एक्सटेंशन का उपयोग करता है
- SQL सर्वर तेज फ़ाइल आरंभीकरण विकल्प का उपयोग करता है
- AUTOSHRINK सभी डेटाबेस के लिए बंद है
समस्या यह है - कि सर्वर के अपटाइम के कुछ बिंदु (कुछ दिनों से लेकर महीनों तक) GHOST CLEANUP
प्रक्रिया शुरू करने से मजबूर क्लीनअप्स को काम करने से मना कर दिया जाता है और बस अपना सामान्य काम किया जाता है - कई सेकंड में कई पेज साफ करता है ( which is seen thru Extended Events
), जो उपयुक्त नहीं है , क्योंकि यह हटाए गए सभी पंक्तियों को साफ करने में सक्षम नहीं है
SQL Server 2005 RTM एंटरप्राइज़ के समय से समस्या बनी रहती है
मुझे इस मुद्दे को हल करने की कोशिश कैसे की गई:
- तालिकाओं के संकुल अनुक्रमित पर SCAN संचालन के लिए मजबूर करने की कोशिश की
- एससीएएन संचालन को मजबूर करने की कोशिश की, जिसमें तालिकाओं के गुच्छे अनुक्रमित पर बीओएलबी कॉलम की सभी सामग्री शामिल है
- सिस्टम sp_clean_db_free_space और sp_clean_db_file_free_space
- DB में सभी फ़ाइलों और पृष्ठों के लिए मैन्युअल रूप से dbcc cleanpage (@dbid, @fileid, @page)
- क्लस्टर इंडेक्स का पुनर्निर्माण और पुनर्गठन
- डेटाबेस को फिर से बनाना
DBCC FORCEGHOSTCLEANUP
जब मैं प्रश्न चलाता हूं:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
मुझे लाखों और दसियों करोड़ भूत रिकॉर्ड दिखाई देते हैं, लेकिन केवल आवंटन इकाई प्रकार LOB_DATA के लिए
केवल चीजें, जो मदद करती हैं:
- SHUTDOWN कमांड के साथ सर्वर को रोकना या पूरे होस्ट को फिर से शुरू करना - यह मदद करता है, पुनरारंभ करने के बाद GHOST CLEANUP प्रक्रिया कुछ घंटे चलती है और वास्तव में सभी भूतों के रिकॉर्ड को साफ करती है
- EMPTYFILE विकल्प के साथ DBCC SHRINKFILE - सभी डेटा को एक फ़ाइल से दूसरी या नई बनाई गई फ़ाइलों में स्थानांतरित करने से केवल इस फ़ाइल में भूत रिकॉर्ड साफ़ होते हैं - समस्या यह है कि मुझे वास्तव में ऑपरेशन से नफरत है। और यह एक फ़ाइल के लिए 3-4 दिन लगते हैं
प्रश्न - क्या सर्वर डाउनटाइम के बिना GHOST CLEANUP को बाध्य करने के लिए कोई प्रोग्रामेटिक (बेहतर) या रखरखाव तरीका मौजूद है, क्योंकि सर्वर डाउनटाइम बहुत अधिक, यहां तक कि अस्वीकार्य है - इसका हजारों से दसियों हजार डॉलर प्रति घंटे तक
समस्याओं पर ध्यान दिया गया था कि यहाँ एक जैसे हैं:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
और बस वही यहाँ है: