SQL डेटाबेस भौतिक फ़ाइल विखंडन


19

मुझे पता है कि वास्तव में तीन प्रकार के विखंडन हैं जिन्हें मुझे एक डीबीए के रूप में चिंतित होने की आवश्यकता है:

  1. SQL डेटा फ़ाइलों में अनुक्रमणिका फ़्रेग्मेंटेशन, क्लस्टर किए गए अनुक्रमणिका (तालिका) विखंडन सहित। DBCC SHOWCONTIG (SQL 2000 में) या sysinos_ db_ index_ physical_ आँकड़े (2005+ में) का उपयोग करके इसे पहचानें।

  2. SQL लॉग फ़ाइलों के अंदर VLF विखंडन । DBCC LOGINFO को देखें कि आपकी प्रत्येक SQL लॉग फ़ाइल में कितने VLF हैं।

  3. हार्ड ड्राइव पर डेटाबेस फ़ाइलों का भौतिक फ़ाइल विखंडन। विंडोज में "डिस्क डिफ्रैगमेंटर" उपयोगिता का उपयोग करके इसका निदान करें। ( इस बेहतरीन ब्लॉग पोस्ट से प्रेरित )

सूचकांक विखंडन पर बहुत ध्यान दिया जाता है ( पॉल रान्डेल का यह उत्कृष्ट सर्वरफॉल्ट उत्तर देखें ), इसलिए यह मेरे प्रश्न का ध्यान केंद्रित नहीं है।

मुझे पता है कि मैं भौतिक विखंडन (और वीएलएफ विखंडन) को रोक सकता हूं जब डेटाबेस मूल रूप से एक उचित अपेक्षित डेटा फ़ाइल और लॉग आकार की योजना बनाकर बनाया जाता है, क्योंकि यह विखंडन अक्सर बढ़ने वाले और सिकुड़ने से होता है, लेकिन मुझे कैसे ठीक करना है इसके बारे में कुछ सवाल हैं पहचान होने के बाद शारीरिक विखंडन:

  • सबसे पहले, एक उद्यम पर भौतिक विखंडन भी प्रासंगिक है SAN? क्या मुझे एक ड्राइव पर Windows Defragmenter का उपयोग करना चाहिए SAN, या SAN टीम को आंतरिक डीफ़्रेग्मेंटिंग उपयोगिताओं का उपयोग करना चाहिए? क्या विखंडन विश्लेषण मुझे विंडोज ड्राइव से मिलता है, तब भी सटीक होता है जब SAN ड्राइव पर चलाया जाता है?

  • SQL प्रदर्शन पर भौतिक विखंडन कितना बड़ा सौदा है? (मान लें कि आंतरिक ड्राइव सरणी है, पूर्व प्रश्न का परिणाम लंबित है।) क्या यह आंतरिक सूचकांक विखंडन की तुलना में बड़ा सौदा है? या यह वास्तव में एक ही तरह की समस्या है (ड्राइव क्रमिक रीड के बजाय यादृच्छिक रीड करने के लिए है)

  • यदि ड्राइव भौतिक रूप से खंडित है, तो डीफ़्रैग्मेंटिंग (या पुनर्निर्माण) समय की बर्बादी को अनुक्रमित करता है? क्या मुझे दूसरे को संबोधित करने से पहले एक को ठीक करने की आवश्यकता है?

  • उत्पादन SQL बॉक्स पर भौतिक फ़ाइल विखंडन को ठीक करने का सबसे अच्छा तरीका क्या है? मुझे पता है कि मैं एसक्यूएल सेवाओं को बंद कर सकता हूं और विंडोज डेफ्राग चला सकता हूं, लेकिन मैंने एक ऐसी तकनीक के बारे में भी सुना है जहां आप एक पूर्ण बैकअप करते हैं, डेटाबेस को गिराते हैं, फिर बैकअप से एक खाली ड्राइव पर पुनर्स्थापित करते हैं। क्या यह बाद की तकनीक की सिफारिश की गई है? इस तरह एक बैकअप से बहाल करने से भी खरोंच से सूचकांक का निर्माण होता है, आंतरिक सूचकांक विखंडन को समाप्त करता है? या क्या यह पृष्ठ क्रम को उसी तरह लौटाता है जब बैकअप लिया गया था? (अगर वह मायने रखता है तो हम कम्प्रेशन के साथ क्वेस्ट लाइटस्पीड बैकअप का उपयोग कर रहे हैं।)

अद्यतन : अच्छा जवाब अब तक कि क्या डीफ्रेग्मेंट सैन ड्राइव्स (NO) और क्या इंडेक्स डिफ्रैग्मेंटेशन अभी भी भौतिक रूप से खंडित ड्राइव्स (YES) पर सार्थक है।

किसी और को वास्तव में डीफ़्रैग्मेन्टेशन करने के लिए सर्वोत्तम तरीकों पर वजन करने की परवाह है? या समय की लंबाई पर एक अनुमान आप यह उम्मीद कर सकते हैं कि यह एक बड़े खंडित ड्राइव को डीफ़्रैग करने के लिए ले जाएगा, 500GB या तो कहेंगे? प्रासंगिक, जाहिर है, क्योंकि उस समय मेरा SQL सर्वर डाउन हो जाएगा!

इसके अलावा, यदि किसी के पास भौतिक विखंडन को ठीक करके आपके द्वारा किए गए SQL प्रदर्शन में सुधार के बारे में कोई महत्वपूर्ण जानकारी है, तो यह बहुत अच्छा होगा। माइक का ब्लॉग पोस्ट समस्या को उजागर करने के बारे में बात करता है, लेकिन यह किस तरह के सुधार के बारे में विशिष्ट नहीं है।

जवाबों:


9

मुझे लगता है कि यह लेख सैन ड्राइव के डीफ़्रैग्मेन्टेशन का एक उत्कृष्ट अवलोकन देता है

http://www.las-solanas.com/storage_virtualization/san_volume_defragmentation.php

बुनियादी बिंदु यह है कि सैन स्टोरेज पर डीफ़्रैग्मेन्टिंग की अनुशंसा नहीं की जाती है क्योंकि डिस्क पर ब्लॉक के भौतिक स्थान को सहसंबंधित करना मुश्किल होता है जब LUN प्रस्तुत करते समय SAN द्वारा स्थान को वर्चुअल किया जाता है।

यदि आप RAW डिवाइस मैपिंग का उपयोग कर रहे थे या आपके पास एक RAID सेट तक सीधी पहुंच है जो कि आपके साथ काम कर रहे LUN है, तो मैं degfragmentation को सकारात्मक प्रभाव दिखा सकता हूं, लेकिन अगर आपको एक साझा RAID से "वर्चुअल" LUN दिया जाता है- 5 सेट, नहीं।


बहुत बढ़िया लेख। SAN ड्राइव के संबंध में सही बिंदु।
ब्रैडेक

7

इस सवाल और जवाब के लिए कई भागों:

एंटरप्राइज सैन स्टोरेज के लिए फिजिकल फाइल विखंडन वास्तव में प्रासंगिक नहीं है, क्योंकि केविन पहले ही इंगित कर चुका है - इसलिए वहां जोड़ने के लिए कुछ भी नहीं है। यह वास्तव में I / O सबसिस्टम के लिए नीचे आता है और आपको स्कैन करते समय अधिक क्रमिक I / Os पर स्कैन करते समय ड्राइव को अधिक यादृच्छिक I / Os से जाने में सक्षम होने की कितनी संभावना है। DAS के लिए, यह अधिक संभावना है कि आप एक जटिल स्लाइस-एन-डाइस सैन के लिए, शायद नहीं।

फ़ाइल-सिस्टम स्तर डीफ़्रैगिंग - केवल इसे SQL बंद करने के साथ करें। मैंने अपने आप को कभी भी समस्याओं का अनुभव नहीं किया है (जैसा कि मैंने एसक्यूएल डेटाबेस फ़ाइलों का ऑनलाइन, ओपन-फाइल डीफ़्रैग नहीं किया है), लेकिन मैंने ग्राहकों और अजीब भ्रष्टाचार समस्याओं के ग्राहकों से बहुत सारे महत्वपूर्ण सबूत सुने हैं। सामान्य ज्ञान यह SQL ऑनलाइन के साथ नहीं है।

विखंडन दर्ज करने के लिए सूचकांक विखंडन पूरी तरह से ऑर्थोगोनल है। एसक्यूएल सर्वर को फ़ाइल-विखंडन का कोई पता नहीं है - इसके लिए बहुत से वर्चुअलाइज़ैटिन परतों के बीच में वास्तविक आई / ओ सबसिस्टम ज्यामिति के बाहर काम करने की कोई उम्मीद है। हालाँकि, इंडेक्स विखंडन, एसक्यूएल के बारे में सब कुछ जानता है। आपके द्वारा पहले से संदर्भित जवाब से खुद को बहुत अधिक दोहराए बिना, सूचकांक विखंडन SQL को कुशल रेंज-स्कैन रीडहेड को रोकने में मदद करेगा, भले ही फ़ाइल-सिस्टम स्तर पर फाइलें कितनी खंडित (या नहीं) हों। यदि आप अपमानजनक क्वेरी प्रदर्शन देख रहे हैं तो इसलिए - बिल्कुल आपको सूचकांक विखंडन को कम करना चाहिए।

आपको इन्हें किसी विशेष क्रम में करने की आवश्यकता नहीं है , हालाँकि यदि आप फ़ाइल-सिस्टम विखंडन का ध्यान रखते हैं और फिर अपने सभी अनुक्रमितों को फिर से बनाते हैं और डीफ़्रेग्मेंटेड वॉल्यूम पर कई फ़ाइलों को बढ़ाकर अधिक फ़ाइल-सिस्टम विखंडन का कारण बनते हैं, तो आप शायद जा रहे हैं टिक कर रहो। हालांकि यह किसी भी पूर्ण मुद्दों का कारण होगा? जैसा कि ऊपर चर्चा की गई है, यह निर्भर करता है :-D

उम्मीद है की यह मदद करेगा!


आह, तो क्या आंतरिक सूचकांक विखंडन वास्तव में ऑप्टिमाइज़र के व्यवहार को बदल देता है, उचित सूचकांक सीमा के बजाय पूर्ण स्कैन का पक्ष लेने के लिए?
ब्रेडक

नहीं। आशावादी को इस बात का कोई ज्ञान नहीं है कि डेटा को डिस्क पर कैसे संग्रहीत किया जाता है, इस तथ्य के अलावा कि सूचकांक मौजूद हैं, उनका आकार और स्तंभ वितरण आंकड़े। यह स्टोरेज इंजन है जो रीडहेड ड्राइव करता है और यह जो स्कैन कर रहा है उसके तार्किक विखंडन के आधार पर व्यक्तिगत I / O आकार को बदल देता है।
पॉल रैंडल

3

उत्पादन SQL बॉक्स पर भौतिक फ़ाइल विखंडन को ठीक करने का सबसे अच्छा तरीका क्या है?

मैं अपने डेटाबेस फ़ाइलों पर SYSINTERNALS 'की दौड़ चलाता हूं।

Http://technet.microsoft.com/en-us/sysinternals/bb897428.aspx देखें


दिलचस्प लग रहा है। मुझे लगता है क्योंकि यह विंडोज डीफ़्रेग एपीआई का उपयोग करता है, कि SQL सेवाओं को बंद करना होगा? या सर्वर / डेटाबेस ऑनलाइन होने के दौरान यह चलेगा?
ब्रैड

मैंने इसे ऑनलाइन MSSQL सर्वर डेटाबेस पर सफलतापूर्वक उपयोग किया है। लेकिन यकीनन वे कम-ट्रैफ़िक और छोटे डेटाबेस (10Gb से कम) थे
विंसेंट बक

यह एक महान उपकरण है! मुझे लगता है कि यह डेटाबेस के लिए अनुप्रयोग बहुत सीमित हैं, जैसा कि अन्य लोगों द्वारा बताया गया है, लेकिन मैं इसे अन्य प्रकार के ड्राइव के लिए प्यार करता हूं। विश्लेषण मोड-ए सुरक्षित है जबकि चीजें चल रही हैं। मैं इसे एक सुरक्षित SQL सर्वर से संबंधित ड्राइव के खिलाफ चलाने में सुरक्षित महसूस नहीं करूंगा।
केंद्र

2

मैं उचित रूप से db को साइज़ करने की सलाह दूंगा, sql सर्वर को बंद करके, डेटाबेस फ़ाइल को किसी अन्य डिस्क सरणी में कॉपी करें, और फिर इसे डीफ़्रैग करने के लिए वापस कॉपी करें। मेरे अनुभव में विंडोज़ डीफ़्रैग का उपयोग करने की तुलना में बहुत तेज़ है।


1

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

यदि आपके अनुक्रमित को डीफ़्रैग्मेन्ट किया जाता है और आंकड़े अपडेट किए जाते हैं (बहुत महत्वपूर्ण) और आप अभी भी I / O को अड़चन के रूप में देखते हैं, तो आप भौतिक विखंडन के अलावा अन्य चीजों से पीड़ित हैं। क्या आपने 80% से अधिक ड्राइव का उपयोग किया है? क्या आपके पास पर्याप्त ड्राइव है? क्या आपके प्रश्नों को पर्याप्त रूप से अनुकूलित किया गया है? क्या आप बहुत सारे टेबल स्कैन कर रहे हैं या बहुत अधिक इंडेक्स की तलाश कर रहे हैं, जिसके बाद क्लस्टर इंडेक्स लुकअप हो गया है? क्वेरी योजनाओं को देखें और अपनी क्वेरी के साथ वास्तव में क्या हो रहा है, यह पता लगाने के लिए "सेट सांख्यिकी io पर" का उपयोग करें। (अधिक संख्या में तार्किक या शारीरिक रीड के लिए देखें)

कृपया मुझे बताएं कि क्या मैं पूरी तरह से गलत हूं।

/ हाकन विन्थर


नहीं, तुम गलत नहीं हो। लेकिन कुछ सर्वर चौड़ा सुधार (यदि संभव हो) बनाने की कोशिश कर थोड़ा 150,000 विशिष्ट SQL कथन है कि साप्ताहिक विश्लेषण नौकरियों के दौरान अमल में गोता शुरू की तुलना में अधिक आकर्षक (नहीं एक अतिशयोक्ति, एक ख़ामोश शायद वास्तव में।) है
BradC

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

1

हो सकता है कि अनुक्रमणिका आपके एप्लिकेशन के लिए पर्याप्त रूप से अनुकूलित नहीं हैं और आपके पास अपने डेटाबेस को अनुकूलित करने के लिए वेरिटास I3 नहीं है तो आप लापता अनुक्रमणिका को खोजने के लिए इस तरह के कथन का उपयोग कर सकते हैं:

       SELECT
      mid.statement,
      mid.equality_columns,
      mid.inequality_columns,
      mid.included_columns,
      migs.user_seeks,
      migs.user_scans,
      migs.last_user_seek,
      migs.avg_user_impact,
      user_scans,
      avg_total_user_cost,
      avg_total_user_cost * avg_user_impact * (user_seeks + user_scans) AS [weight]--, migs.*--, mid.*
   FROM
      sys.dm_db_missing_index_group_stats AS migs
      INNER JOIN sys.dm_db_missing_index_groups AS mig
         ON (migs.group_handle = mig.index_group_handle)
      INNER JOIN sys.dm_db_missing_index_details AS mid
         ON (mig.index_handle = mid.index_handle)
   ORDER BY
      avg_total_user_cost * avg_user_impact * (user_seeks + user_scans) DESC ;

या अनुक्रमणिका खोजने के लिए इस तरह का एक बयान जो चुनिंदा कथनों में उपयोग नहीं किया जाता है और अद्यतन / प्रविष्टि को घटाता है:

    CREATE PROCEDURE [ADMIN].[spIndexCostBenefit]
    @dbname [nvarchar](75)
WITH EXECUTE AS CALLER
AS
--set @dbname='Chess'
declare @dbid nvarchar(5)
declare @sql nvarchar(2000)
select @dbid = convert(nvarchar(5),db_id(@dbname))

set @sql=N'select ''object'' = t.name,i.name
        ,''user reads'' = iu.user_seeks + iu.user_scans + iu.user_lookups
        ,''system reads'' = iu.system_seeks + iu.system_scans + iu.system_lookups
        ,''user writes'' = iu.user_updates
        ,''system writes'' = iu.system_updates
from '+ @dbname + '.sys.dm_db_index_usage_stats iu
,' + @dbname + '.sys.indexes i
,' + @dbname + '.sys.tables t
where 
    iu.database_id = ' + @dbid + '
and iu.index_id=i.index_id
and iu.object_id=i.object_id
and iu.object_id=t.object_id
AND (iu.user_seeks + iu.user_scans + iu.user_lookups)<iu.user_updates
order by ''user reads'' desc'

exec sp_executesql @sql

set @sql=N'SELECT
   ''object'' = t.name,
   o.index_id,
   ''usage_reads'' = user_seeks + user_scans + user_lookups,
   ''operational_reads'' = range_scan_count + singleton_lookup_count,
   range_scan_count,
   singleton_lookup_count,
   ''usage writes'' = user_updates,
   ''operational_leaf_writes'' = leaf_insert_count + leaf_update_count + leaf_delete_count,
   leaf_insert_count,
   leaf_update_count,
   leaf_delete_count,
   ''operational_leaf_page_splits'' = leaf_allocation_count,
   ''operational_nonleaf_writes'' = nonleaf_insert_count + nonleaf_update_count + nonleaf_delete_count,
   ''operational_nonleaf_page_splits'' = nonleaf_allocation_count
FROM
   ' + @dbname + '.sys.dm_db_index_operational_stats(' + @dbid + ', NULL, NULL, NULL) o,
   ' + @dbname + '.sys.dm_db_index_usage_stats u,
    ' + @dbname + '.sys.tables t
WHERE
   u.object_id = o.object_id
   AND u.index_id = o.index_id
    and u.object_id=t.object_id
ORDER BY
   operational_reads DESC,
   operational_leaf_writes,
   operational_nonleaf_writes'

exec sp_executesql @sql

GO

मेरे पास कुछ अन्य एसक्यूएल स्टेटमेंट हैं जिनका उपयोग मैं तब कर रहा हूं जब मैं उत्पादन वातावरण में प्रदर्शन के मुद्दों का विश्लेषण करता हूं, लेकिन ये दोनों एक अच्छी शुरुआत है जो मुझे लगता है।

(मुझे पता है, यह पोस्ट थोड़ा सा विषय है, लेकिन मुझे लगा कि आपको रुचि हो सकती है क्योंकि इसे अनुक्रमण रणनीति के साथ करना है)

/ हाकन विन्थर


उत्कृष्ट स्क्रिप्ट, मेरे पास कुछ बहुत समान हैं। दुर्भाग्य से, हम अभी भी 40% SQL 2000 (प्रश्न में सर्वर सहित), जो इन "लापता सूचकांक" DMV के बराबर नहीं है।
ब्रैडक

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