मेरे डेटाबेस को फिर से बनाने और सब कुछ फिर से बनाने के बाद भी मेरा डेटाबेस क्यों खंडित है?


41

मेरे पास एक डेटाबेस है जिसे मैंने इस टी-एसक्यूएल को चलाकर एक ही बार में सभी टेबल्स को डीफ़्रैग्मेन्ट करने की कोशिश की है:

SELECT 
        'ALTER INDEX all ON ' + name + ' REORGANIZE;' + CHAR(10) +
        'ALTER INDEX all ON ' + name + ' REBUILD;'
    FROM sys.tables

और फिर आउटपुट को एक नई क्वेरी विंडो में कॉपी करना और पेस्ट करना और उसे चलाना। मुझे कोई त्रुटि नहीं मिली, लेकिन मेरे पास अभी भी विखंडन है। मैंने दोनों आज्ञाओं को अलग-अलग चलाने की कोशिश की और अभी भी विखंडन है। नोट: मुझे अवगत कराया गया है कि REORGANIZEआरोन द्वारा अनावश्यक है, और मुझे पता है कि मैं इसे स्वचालित करने के लिए गतिशील sql का उपयोग कर सकता हूं।

मैं यह निर्धारित करने के लिए भाग गया कि मेरे पास अभी भी विखंडन है:

SELECT * FROM 
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, NULL) 
WHERE avg_fragmentation_in_percent > 0

और मुझे मिल गया:

database_id object_id   index_id    partition_number    index_type_desc alloc_unit_type_desc    index_depth index_level avg_fragmentation_in_percent    fragment_count  avg_fragment_size_in_pages  page_count  avg_page_space_used_in_percent  record_count    ghost_record_count  version_ghost_record_count  min_record_size_in_bytes    max_record_size_in_bytes    avg_record_size_in_bytes    forwarded_record_count  compressed_page_count
85  171147655   1   1   CLUSTERED INDEX IN_ROW_DATA 2   0   36.3636363636364    5   2.2 11  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
85  421576540   1   1   CLUSTERED INDEX IN_ROW_DATA 2   0   75  7   1.14285714285714    8   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
85  965578478   1   1   CLUSTERED INDEX IN_ROW_DATA 2   0   14.7058823529412    6   5.66666666666667    34  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
85  1061578820  1   1   CLUSTERED INDEX IN_ROW_DATA 2   0   40  4   1.25    5   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
85  1109578991  1   1   CLUSTERED INDEX IN_ROW_DATA 2   0   30.7692307692308    5   2.6 13  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
85  1205579333  2   1   NONCLUSTERED INDEX  IN_ROW_DATA 2   0   50  5   1.6 8   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
85  1493580359  1   1   CLUSTERED INDEX IN_ROW_DATA 2   0   50  6   1.66666666666667    10  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL

मुझे पता है कि मुझे कुछ वास्तविक बुनियादी याद आ रही है, लेकिन मुझे नहीं पता कि क्या।


आपको क्या त्रुटियां मिलीं? वहाँ भी एक कारण है कि आप इसे पुनर्गठित और एक ही बात का पुनर्निर्माण है?
शॉन मेल्टन

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

जवाबों:


38

टेबल छोटे हैं। आपके टेबल में पृष्ठ संख्याएँ हैं:

11, 8, 6, 5, 13, 8, 10

उन्होंने कुल 480kb पर कब्जा किया। वस्तुतः डीफ़्रैग करने के लिए कुछ भी नहीं है।

संपादित करें: यह थोड़ा और स्पष्टीकरण देता है।

एक नया टेबल या इंडेक्स आमतौर पर समान सीमा के बजाय एक मिश्रित से पहले 8 पेज आवंटित किया जाता है। इसलिए, पहले 8 पृष्ठों में से प्रत्येक के लिए अलग-अलग मिश्रित extents से आवंटित किया जाना संभव है। 8 पृष्ठों का उपभोग करने वाली एक तालिका या सूचकांक में 8 टुकड़े हो सकते हैं, प्रत्येक 8 अलग-अलग मिश्रित प्रत्ययों पर 1।

अधिक व्यापक रूप से प्रयुक्त डीफ़्रैग स्क्रिप्ट (नीचे दिए गए उदाहरणों के एक जोड़े) इस वजह से छोटी तालिकाओं को बाहर करने के लिए करते हैं। IIRC, <500 पृष्ठ उनमें से एक या दोनों में हैं। इन आकारों में, डीफ़्रैग्मेन्टिंग करने के लिए बहुत कम लाभ होता है और विखंडन के आंकड़े मिश्रित सीमा के आवंटन से संभावित रूप से तिरछा हो जाते हैं।


ठीक है, यह संतोषजनक है जब तक कि किसी और के पास बेहतर उत्तर न हो मैं आपको सही के रूप में चिह्नित करूंगा।
जस्टिन डियरिंग

3
+1 मार्क से सहमत। विखंडन के बारे में चिंता करें जब आपके पास वास्तव में कुछ डेटा हो। :-)
हारून बर्ट्रेंड

मैं पूरी तरह समझ गया कि आप क्या कह रहे हैं। लेकिन सिर्फ सरासर जिज्ञासा से बाहर, यह है क्योंकि डीबी इंजन बस ऐसे कुछ पृष्ठों को डीफ़्रैग नहीं कर सकता है? मेरा मतलब है, इसके लिए एक कारण होना चाहिए।
थॉमस स्ट्रिंगर

3
ऐसा नहीं है कि यह नहीं हो सकता है, लेकिन यह परेशान क्यों करेगा? ऐसा करने से I / O पर कोई प्रभाव नहीं पड़ने वाला है - विशेषकर जब से यह छोटे हैं वैसे भी स्मृति में होने की गारंटी है।
हारून बर्ट्रेंड

1
बस। अजीब लगता है, बस इतना ही। मान लीजिए कि मैं सूचकांक विखंडन पर जाँच करने और रिपोर्ट करने के लिए एक आवेदन लिख रहा हूँ, मुझे न केवल नाज़ुक प्रतिशत का परीक्षण करने के लिए, बल्कि पेजों की मात्रा भी नहीं होनी चाहिए ताकि झूठे अलार्म न हों।
थॉमस स्ट्रिंगर

19

" Microsoft SQL Server 2000 इंडेक्स डीफ़्रैग्मेन्टेशन बेस्ट व्यवहार " से उद्धरण :

"विखंडन डिस्क I / O को प्रभावित करता है। इसलिए, बड़े इंडेक्स पर ध्यान केंद्रित करें क्योंकि SQL सर्वर द्वारा उनके पृष्ठों की संभावना कम होती है। इंडेक्स के आकार (प्रत्येक पृष्ठ) का अंदाजा लगाने के लिए DBCC SHOWCONTIG द्वारा रिपोर्ट की गई पृष्ठ संख्या का उपयोग करें। आकार में 8 KB) आम तौर पर, आपको 1,000 से कम पृष्ठों वाले अनुक्रमित के विखंडन के स्तर से चिंतित नहीं होना चाहिए। परीक्षणों में, 10,000 से अधिक पृष्ठों वाले अनुक्रमितों को प्रदर्शन लाभ का एहसास हुआ, जिसमें सबसे अधिक पृष्ठों वाले सूचकांक पर सबसे अधिक लाभ हुआ (अधिक से अधिक) 50,000 से अधिक पेज) । "

तो इस तरह के आपके सवाल का जवाब है और मार्क और हारून के जवाब का समर्थन करता है।

आप ब्रेंट ओजेर के निम्नलिखित लेखों में सूचकांक विखंडन के बारे में अच्छी जानकारी प्राप्त कर सकते हैं:

इसके अलावा .. सामान्य रूप से अनुक्रमित (विखंडन मुद्दों के बारे में) के बारे में महान जानकारी का महासागर किम्बर्ली ट्रिप के ब्लॉग पर पाया जा सकता है ।


12

यह आपके सवाल का जवाब देने के लिए नहीं है, लेकिन यह एक टिप्पणी में फिट नहीं होगा। आप आउटपुट को किसी अन्य विंडो में कॉपी और पेस्ट किए बिना गतिशील रूप से इस स्क्रिप्ट का निर्माण कर सकते हैं। इस बात को ध्यान में रखते हुए कि कोई कारण नहीं है REORGANIZEऔर फिर REBUILD:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'ALTER INDEX all ON ' + name + ' REBUILD;
    ' FROM sys.tables;

PRINT @sql; -- to see the first 8,000 characters and make sure it checks out
-- EXEC sp_executesql @sql;

हारून, गतिशील sql को इंगित करने के लिए धन्यवाद, मैं गतिशील sql से अच्छी तरह से वाकिफ हूं, मैं तब तक समाधान को स्वचालित करने वाला नहीं था जब तक यह काम नहीं करता। इसे पढ़ने वाले अन्य लोगों को शायद जागरूक होना चाहिए।
जस्टिन डिअरिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.