SQL सर्वर में HEAP फ्रैग्मेंटेशन को कम कैसे करें?


10

मुझे हाल ही में पता चला है कि एक हीप टेबल में 70% से अधिक विखंडन था। इसलिए मैंने ए करने का फैसला किया

ALTER TABLE dbo.myTable REBUILD

काफी मजेदार, बाद में मैं 20% विखंडन था। तब से उस टेबल पर कोई लिखा नहीं था। इसलिए मैंने एक और बार पुनर्निर्माण करने का फैसला किया।

2 बार के बाद तालिका में 50% विखंडन इतना अधिक है! मैं वास्तव में यह कैसे हो सकता है समझ में नहीं आता ...


तार्किक विखंडन कहने पर आपका क्या मतलब है। यह डेटा पृष्ठों के उपयोग के संदर्भ में विखंडन है। मुझे पता है कि कोई आदेश नहीं है लेकिन अनियंत्रित डेटा प्रति खंड खंडित नहीं है। इस मामले में विखंडन का अर्थ है डेटा पृष्ठों का कुशल उपयोग।
tuxmania

2
मुझे लगता है कि हमें पूछना चाहिए कि मेज कितनी बड़ी है? पंक्तियों और पृष्ठों में।
कोडी कोनिओर

जवाबों:


17

हीप में फ्रैग्मेन्टेशन मीन्स का क्या मतलब है

ढेर में विखंडन मूल्य जो आपको DMV avg_fragmentation_in_percentसे क्वेरी करके कॉलम से मिलता sys.dm_db_index_physical_statsहै

अनुक्रमणिका के लिए तार्किक विखंडन, या IN_ROW_DATA आवंटन इकाई में ढेर के लिए विखंडन

इसके अलावा उसी BOL का कहना है कि

यह ढेर के पत्तों के पन्नों में बाहर के क्रम का प्रतिशत है। एक आउट-ऑफ-ऑर्डर सीमा वह होती है जिसके लिए वह सीमा जिसमें ढेर के लिए वर्तमान पृष्ठ होता है, उस सीमा के बाद भौतिक रूप से अगला सीमा नहीं होती है जिसमें पिछला पृष्ठ होता है।

तो आप देख सकते हैं कि यह ढेर के लिए आवंटित पृष्ठों में मौजूद मुक्त स्थान नहीं है, लेकिन विखंडन बनाने वाले पृष्ठों का अलग-अलग क्रम है

इसका परीक्षण छोटे परीक्षण द्वारा किया जा सकता है। हमें एक ढेर तालिका बनाएं और उसमें कुछ रिकॉर्ड डालें और फिर विखंडन की जांच करें।

create table dbo.HeapTest
(
Id INT not NULL Default (1),
Col1   char(5000) Not null Default ('Heaps Are Cool')
)

SET NOCOUNT ON

Insert into dbo.Heaptest default values
go 50

select index_type_desc,avg_fragmentation_in_percent,fragment_count,
avg_page_space_used_in_percent,record_count
from sys.dm_db_index_physical_stats(db_id(),object_id('dbo.HeapTest','U'),0,default,'detailed')

तो इसमें 50 रिकॉर्ड के साथ हीप टेबल बनाई गई है। नीचे डीएमवी sysinos_db_index_physical आँकड़े क्वेरी के बाद विखंडन कैसा दिखता है

यहां छवि विवरण दर्ज करें

आप देख सकते हैं avg_fragmentation_in_percentस्तंभ का मान 33% है। अब देखते हैं कि पेज कैसे व्यवस्थित होते हैं। यह अनिर्दिष्ट क्वेरी का उपयोग करके किया जा सकता है %%lockres%%। क्वेरी होगी

SELECT  %%lockres%%, * FROM dbo.HeapTest;

और नीचे आउटपुट जैसा दिखता है। इसका केवल प्रासंगिक भाग संलग्न करना। जब हम अपनी dbo.HeapTest तालिका में 50 पंक्तियाँ सम्मिलित करते हैं, तो क्वेरी 50 पंक्तियों का उत्पादन करती है।

यहां छवि विवरण दर्ज करें

यह कहता है कि पहले पृष्ठ में आईडी है 197, अगले पृष्ठ में आईडी है 242बाद के पृष्ठों में निरंतर आईडी है जब तक हम पेज आईडी तक नहीं पहुंचते 264क्योंकि उसके बाद हमें पेज आईडी मिलती है 280। इसलिए पेज आईडी नंबर में यह उछाल वास्तव में विखंडन का कारण बन रहा है।

अब कीट ढेर का पुनर्निर्माण करते हैं और विखंडन को देखने के लिए फिर से कमांड चलाते हैं और पृष्ठों को कैसे व्यवस्थित किया जाता है। हमें जैसे विखंडन मिलता है

यहां छवि विवरण दर्ज करें

आप देख सकते हैं विखंडन अब है 14%

हमें पृष्ठ संख्याएँ आवंटित देखें

यहां छवि विवरण दर्ज करें

हमारे पास केवल एक कूद बाकी है जो सभी पृष्ठों को क्रमबद्ध रूप से पृष्ठ आईडी आवंटित किया गया है। चूंकि सिर्फ एक छलांग विखंडन में काफी कमी आई।

मैं फिर से ढेर का पुनर्निर्माण करता हूं और अब जब मैंने विखंडन की जांच की तो यह पूरी तरह से चला गया था। और पेज आईडी आवंटन की तरह है

यहां छवि विवरण दर्ज करें

विखंडन क्यों बढ़ा

अब विखंडन के कारण क्या हो सकता है, इसके बारे में हम इस तथ्य को पुष्टि कर सकते हैं कि जब पृष्ठों को ढेर में आवंटित किया जा रहा था, तो वे निरंतर नहीं होंगे, जैसा कि आपने ऊपर देखा कि विखंडन मूल्य में वृद्धि के कारण पेज के आवंटित पृष्ठ में कूद गया था।

सिर के पीछे आपको यह भी ध्यान रखना चाहिए कि HEAP के लिए शब्द विखंडन का कोई अर्थ नहीं है, आप अन-ऑर्डर किए गए पृष्ठों के गुच्छा के लिए विखंडन को कैसे परिभाषित करेंगे।

वास्तव में विखंडन के बारे में चिंतित हैं

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

पुनश्च: कृपया उत्पादन प्रणाली पर अनिर्धारित कमांड का उपयोग न करें। यह सिर्फ प्रदर्शन के लिए था।


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

आप चुनिंदा सूचकांक_type_desc, avg_fragmentation_in_percent, fragment_count, avg_page_space_used_in_percent, record_count से sysinos_db_index_physical_stats (db_id), object_id ('dboH.pl.est') कैसे चलाते हैं। एक मेज ? यह मेरे लिए सभी टेबलों पर सभी अनुक्रमितों पर लौटता है, भले ही मैं 'ऑब्जेक्ट_ड' में अपनी तालिका का नाम सही करूं
मिकेल

@ मिकेल मैंने फ़ंक्शन db_id () का उपयोग किया है जो वर्तमान डेटाबेस को ले जाएगा और मैंने विशेष रूप से ऑब्जेक्ट नाम दिया है, इसलिए यह हमेशा वर्तमान डेटाबेस में दिखेगा Heaptestऔर परिणाम की तलाश करेगा और देगा। मुझे यकीन है कि आप कुछ याद कर रहे होंगे। बस सुनिश्चित करें कि संगतता स्तर 80 नहीं है उस मामले में db_id फ़ंक्शन बीमार नहीं काम करता है
Shanky

@ शैंकी आप उत्पादन में अनिर्दिष्ट क्वेरी%% लॉकरे%% का उपयोग करने की अनुशंसा क्यों नहीं करते? क्या आप इसे विस्तार से बता सकते हैं?
राल्फ

@ user1624552 केवल इसलिए कि यह अनिर्दिष्ट है, इसका मतलब है कि एमएस भी इसके बारे में प्रलेखन अद्यतन नहीं रखता है। इसके प्रभाव क्या हैं, यह कैसे काम करता है, इसका कहीं भी दस्तावेजीकरण नहीं किया गया है, इसीलिए ऐसा कहा गया है। Ex में कमांड fn_dump_dblog () है जो हिडन शेड्यूलर बनाता है और यह अच्छा नहीं है। यह कमांड भी असमर्थित है। आप इसका उपयोग कर सकते हैं लेकिन जोखिम आप पर है।
शंकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.