2010-02-16 12 views
22

वर्तमान में हमारे डेटाबेस में 10 जीबी आकार है और प्रति माह लगभग 3 जीबी बढ़ रहा है। अक्सर मैं सुनता हूं कि क्वेरी निष्पादन समय में सुधार करने के लिए समय-समय पर इंडेक्स का पुनर्निर्माण करना चाहिए। तो मुझे दिए गए परिदृश्य में इंडेक्स को कितनी बार पुनर्निर्माण करना चाहिए?हमारे SQL सर्वर डेटाबेस में अनुक्रमणिका को कितनी बार पुनर्निर्मित किया जाना चाहिए?

उत्तर

32

वहाँ एक आम सहमति है कि आप फिर से संगठित करना चाहिए अपने सूचकांक जैसे ही सूचकांक विखंडन अधिक से अधिक 5 (कभी कभी 10%) तक पहुँच जाता है ("को Defragment") है, और आप उन्हें फिर से बनाना पूरी तरह से जब यह 30% से परे चला जाता चाहिए (कम से कम वह संख्या है जो मैंने कई जगहों पर वकालत की है)।

मिशेल उफर्ड (ए.के.ए. "एसक्यूएल फूल") में automated index defrag script है, जो कि इंडेक्स को पुनर्गठित या पुनर्निर्माण करने का निर्णय लेने के लिए उन सटीक सीमाओं का उपयोग करता है।

कुछ अच्छे विचारों और सूचकांक पुनर्निर्माण से निपटने के तरीकों के साथ Brad McGehee's tips on rebuild indexes भी देखें।


मैं यहाँ इस स्क्रिप्ट का उपयोग (याद नहीं कर सकते हैं जब मैं से मिला - जो कोई भी यह था: बहुत धन्यवाद वास्तव में उपयोगी सामान) किसी दिए गए डेटाबेस में अपने सभी सूचकांकों पर सूचकांक विखंडन प्रदर्शित करने के लिए:

SELECT 
    t.NAME 'Table name', 
    i.NAME 'Index name', 
    ips.index_type_desc, 
    ips.alloc_unit_type_desc, 
    ips.index_depth, 
    ips.index_level, 
    ips.avg_fragmentation_in_percent, 
    ips.fragment_count, 
    ips.avg_fragment_size_in_pages, 
    ips.page_count, 
    ips.avg_page_space_used_in_percent, 
    ips.record_count, 
    ips.ghost_record_count, 
    ips.Version_ghost_record_count, 
    ips.min_record_size_in_bytes, 
    ips.max_record_size_in_bytes, 
    ips.avg_record_size_in_bytes, 
    ips.forwarded_record_count 
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips 
INNER JOIN 
    sys.tables t ON ips.OBJECT_ID = t.Object_ID 
INNER JOIN 
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id 
WHERE 
    AVG_FRAGMENTATION_IN_PERCENT > 0.0 
ORDER BY 
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count 
+0

ब्रैड मैक्गी की युक्तियों का लिंक टूटा हुआ है। हो सकता है कि यह सही लिंक है, http://www.sql-server-performance.com/2007/rebuilding-indexes/ –

1

अपने डेटाबेस के आकार को देखते हुए, आप प्रति माह एक बार इंडेक्स को आसानी से पुनर्निर्माण कर सकते हैं। लेकिन जैसे ही आकार बढ़ता है, लगभग 500 जीबी कहें, आप इसे प्रति माह दो बार कर सकते हैं।

+1

बेशक, खुले लेनदेन की संख्या, उनके प्रकार और जीवनकाल के आधार पर।यह एक बहुत सक्रिय 10 जीबी डेटाबेस हो सकता है। – NTDLS

4

"जब आपको आवश्यकता हो" और "जब आप कर सकते हैं"!

उदाहरण के लिए

...

  • विखंडन के लिए टेस्ट पहले और कुछ भी नहीं, reorg करते हैं या पुनर्निर्माण के लिए कि क्या निर्णय लेते हैं। SQL Fool's script does this, उदाहरण के लिए, सप्ताहांत में @minFragmentation और @rebuildThreshold मापदंडों

  • Do दैनिक आँकड़ों, कहते हैं, लेकिन अनुक्रमित है। आपकी रखरखाव खिड़की क्या है?

1

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

आपको अपने सूचकांक के विखंडन स्तर की जांच करने के लिए dbcc showcontig([Table]) का उपयोग करने की आवश्यकता होगी, यह निर्धारित करें कि वे कितनी बार खंडित हो जाते हैं और वास्तव में विखंडन किस स्तर पर होता है।

dbcc dbreindex([Table]) का उपयोग इंडेक्स को पूरी तरह से पुनर्निर्मित करने के लिए करें जब वे बहुत खंडित हो जाएं (20% -30% या इससे ऊपर) लेकिन यदि आपको पर्याप्त पर्याप्त डाउनटाइम विंडो नहीं मिलती है और विखंडन स्तर अपेक्षाकृत कम (1% -25%) है , आपको "ऑनलाइन" फ़ैशन में इंडेक्स को डिफ्रैग करने के लिए dbcc indexdefrag([Database], [Table], [Index]) का उपयोग करना चाहिए। यह भी ध्यान रखें, कि आप इंडेक्स डिफ्रैग ऑपरेशन को रोक सकते हैं और बाद में किसी भी काम को खोए बिना इसे फिर से शुरू कर सकते हैं।

डेटाबेस और इसकी अनुक्रमणिका को "ट्यून में" रखना कुछ हद तक निगरानी रखता है ताकि वास्तव में यह महसूस हो सके कि कब और क्या रीइंडेक्स किया जाए।

+1

आप SQL Server 2005+ – gbn

+0

में इन 3 डीबीसीसी कमांडों में से कोई भी उपयोग नहीं करेंगे, मैं स्वीकार्य रूप से एक पुराना- स्कूल एसक्यूएल लड़का। कृपया कुछ विवरण छोड़ दो .... मुझे प्रबुद्ध करें। – NTDLS

+1

क्योंकि उन्हें SQL सर्वर 2005 से शुरू होने के रूप में चिह्नित किया गया है और भविष्य के संस्करण में हटा दिया जाएगा। यहां केवल 2 यूआरएल इसका उल्लेख कर रहे हैं: http://weblogs.sqlteam.com/tarad/archive/2007/02/26/60121.aspx और http://www.mssqltips.com/tip.asp?tip=1352 और यहां ज्ञान का आधिकारिक शब्द है: http://msdn.microsoft.com/en-us/library/ms143729.aspx –

संबंधित मुद्दे