Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर - sp_spaceused के आंतरिक भाग को विच्छेदित करें

यह लेख sp_spaceused . के आउटपुट को विच्छेदित करने का एक प्रयास है संग्रहीत प्रक्रिया।

परिचय

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

यह लेख मानता है:

  1. sp_spaceused में एक झलक
  2. आवंटित और अप्रयुक्त स्तंभों पर ऑटो-विकास सेटिंग का प्रभाव
  3. डेटाबेस और इंस्टेंस स्तरों पर स्थान उपयोग विवरण ढूँढना
  4. ऑटो-ग्रोथ इवेंट को मापना
  5. mdf और ldf फ़ाइल आकार ढूँढना
  6. डेटाबेस के प्रदर्शन को निर्धारित करने वाले कारक
  7. और भी बहुत कुछ...

sp_spaceuseed के आंतरिक भाग

सभी तालिकाओं का स्थान उपयोग विवरण कैप्चर करें

नीचे टी-एसक्यूएल में, गैर-दस्तावेजी संग्रहीत कार्यविधि sp_MSforeachtable का उपयोग वर्तमान डेटाबेस संदर्भ के दायरे में सभी तालिकाओं को पार करने के लिए किया जाता है ताकि संदर्भ में सभी तालिकाओं के स्थान उपयोग मेट्रिक्स प्राप्त किए जा सकें।

Declare @tbl_sp_spaceused table(
    name varchar(100) NULL,
    rows bigint NULL,
    reserved varchar(20) NULL,
    data varchar(20) NULL,
    index_size varchar(20) NULL,
    unused varchar(20) NULL
    )

-- insert output of sp_spaceused to table variable

INSERT INTO @tbl_sp_spaceused ( name, rows, reserved, data, index_size, unused )
EXEC sp_MSforeachtable @command1 = 'EXEC sp_spaceused [?]'

SELECT *
FROM @tbl_sp_spaceused
order by rows desc

सभी डेटाबेस के स्थान उपयोग विवरण कैप्चर करें

गैर-दस्तावेज संग्रहीत कार्यविधि sp_MSforeachDB का उपयोग सभी डेटाबेस के स्थान उपयोग की जानकारी प्राप्त करने के लिए वर्तमान SQL उदाहरण के दायरे में संपूर्ण डेटाबेस को पार करने के लिए किया जाता है।

declare @tbl_sp_spaceusedDBs table(
    database_name varchar(100) NOT NULL,
    database_size varchar(50) NULL,
    unallocated varchar(30) NULL,
    reserved varchar(20) NULL,
    data varchar(20) NULL,
    index_size varchar(20) NULL,
    unused varchar(20) NULL
    )
INSERT INTO @tbl_sp_spaceusedDBs ( database_name, database_size, unallocated, reserved, data, index_size, unused )
EXEC sp_msforeachdb @command1="use ? exec sp_spaceused @oneresultset = 1"

SELECT *
FROM @tbl_sp_spaceusedDBs
ORDER BY database_name, database_size

यहां, डेटाबेस_नाम डेटाबेस का नाम है; इस मामले में, पायथन नमूना . डेटाबेस_आकार Uनियुक्त+आरक्षित+डेटा+इंडेक्स+अप्रयुक्त =MDF +LDF है (=इस मामले में 848 एमबी)। आवंटित नहीं किया गया यहाँ स्थान 51.94 एमबी है।

यह वास्तव में, डिस्क सीमा है जिसे डेटाबेस के लिए चिह्नित किया गया है। sp_spaceused डेटाबेस स्तर पर परिभाषित असंबद्ध कॉलम को आउटपुट करता है और यह किसी भी तालिका के लिए आरक्षित नहीं है और इसे पहले ऑब्जेक्ट द्वारा लिया जा सकता है जो बढ़ने के लिए अधिक जगह का दावा करता है।

आवंटित नहीं स्पेस डेटा फ़ाइल के अंदर का खाली स्थान है ताकि हर बार जब आप कोई प्रश्न जारी करते हैं तो उसे ऑटो-ग्रो न करना पड़े; आमतौर पर, SQL सर्वर स्टोरेज इंजन आनुपातिक भरण एल्गोरिथम नामक तंत्र का उपयोग करके ऑटोग्रोथ का प्रबंधन करता है। फाइलों पर होने वाले लेखन की संख्या के आधार पर विस्तार का प्रबंधन प्रभावी ढंग से किया जाता है। और साथ ही, जब उपयोग की गई जगह एक सीमा तक पहुंच जाती है, तो आगे ऑटो-विकास के लिए एक घटना शुरू हो जाती है। आवंटित स्थान का सही मूल्य निर्धारित करना जरूरतों और स्थितियों और डेटाबेस के उपयोग की प्रकृति पर निर्भर करता है। असंबद्ध स्थान वह स्थान है जो अभी उपयोग में नहीं है, और "पकड़ने के लिए तैयार" है। संक्षेप में, इन विस्तारों को GAM पृष्ठ में बिट 1 के साथ चिह्नित किया गया है। ऊपर से ऑटोग्रोथ की अवधारणा को समझते हुए, किसी भी प्रकार की वृद्धि आगे असंबद्ध विस्तार उत्पन्न कर सकती है।

निम्न SQL क्वेरी का उपयोग करके, हम देख सकते हैं कि कितनी बार ऑटो-ग्रोथ इवेंट उत्पन्न हुआ था, साथ ही प्रक्रिया के लिए डेटाबेस ने कितने समय तक होल्ड पर रखा है।

DECLARE @fname NVARCHAR(1000);

-- Get the name of the current default trace
SELECT @fname = CAST(value AS VARCHAR(MAX))
FROM ::fn_trace_getinfo(DEFAULT)
WHERE traceid = 1 AND property = 2;


SELECT 
	 ft.StartTime [Start Time]
	,t.name [Event Name]
	,DB_NAME(ft.databaseid) [Database Name]
	,ft.Filename [File Name]
	,(ft.IntegerData*8)/1024.0 [Growth MB]
	,(ft.duration/1000) [Duration MS]
FROM ::fn_trace_gettable(@fname, DEFAULT) AS ft 
INNER JOIN sys.trace_events AS t ON ft.EventClass = t.trace_event_id  
WHERE (ft.EventClass = 92  -- DateFile Auto-growth
    OR ft.EventClass = 93) -- LogFile Auto-growth
ORDER BY ft.StartTime

आइए देखें कि प्रत्येक शब्द का क्या अर्थ है:

आरक्षित :डेटाबेस ऑब्जेक्ट द्वारा उपयोग के लिए आरक्षित स्थान =(डेटा +इंडेक्स + अप्रयुक्त ) =476704 + 1280 + 1312 =479296 केबी। यह इंगित करता है कि वस्तुएं कितनी पूर्ण हैं; आदर्श रूप से, अप्रयुक्त स्थान का 10% लेनदेन संबंधी तालिकाओं के लिए अपेक्षित है।

डेटा :डेटा का वास्तविक आकार। यह डेटाबेस की सभी डेटा फ़ाइलों का योग है।

सूचकांक :सूचकांक द्वारा उपयोग की जाने वाली जगह की मात्रा।

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

अप्रयुक्त :आरक्षित स्थान का एक भाग, जिसका अभी तक उपयोग नहीं हुआ है

अप्रयुक्त आवंटित विस्तार पर पृष्ठ हैं लेकिन अभी तक किसी भी वस्तु द्वारा उपयोग नहीं किए गए हैं। जैसे ही एक सीमा आवंटित की जाती है (या तो वर्दी या साझा सीमा के रूप में), हमें उस सीमा पर आठ आरक्षित पृष्ठ मिलते हैं। कुछ पृष्ठों का उपयोग किया जाता है, और कुछ का उपयोग नहीं किया जाता है।

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

.mdf फ़ाइल और .log फ़ाइलों के आकार का पता लगाने के लिए sp_spaceused के आउटपुट को और सरल बनाया जा सकता है। आरक्षित स्थान और आवंटित स्थान का योग कमोबेश डेटा-या MDF-फ़ाइल के आकार के बराबर होता है। साथ ही, डेटाबेस आकार से MDF फ़ाइल का आकार घटाने से लॉग फ़ाइल का आकार मिलता है।

तो ये रहे दो सूत्र:

एमडीएफ फ़ाइल का आकार =आरक्षित + असंबद्ध स्थान

लॉग फ़ाइल का आकार =Database_Size – MDF फ़ाइल का आकार

SELECT 476704+ 1280+ 1312 'Reserved KB', (479296/1024.00)+51.94 'MDFSizeMB', 848.00 - ((479296/1024.00)+51.94) 'LogSizeMB'

उपरोक्त बिंदु हमें बताते हैं कि sp_spaceused के आउटपुट में प्रत्येक कॉलम की व्याख्या, गणना और विश्लेषण कैसे किया जाता है।

ऑटो-ग्रोथ सेटिंग का प्रभाव

प्रारंभिक आकार और ऑटो-ग्रोथ कॉन्फ़िगरेशन का अप्रयुक्त स्थान पर महत्वपूर्ण प्रभाव पड़ता है। इनके लिए सही मूल्य निर्धारित करना एक चुनौती है। मैंने ऐसे कई मामले देखे हैं जहां प्रतिशत के हिसाब से ऑटो-ग्रोथ बढ़ना तय था। आइए मान लें कि 100 जीबी के डेटा फ़ाइल आकार के लिए ऑटो-ग्रोथ 25% पर सेट है। डिस्क ड्राइव को भरने में केवल 4 ऑटो-ग्रोथ इवेंट लगते हैं।

दूसरा मामला इंडेक्स का पुनर्निर्माण कर रहा है। इस ऑपरेशन का तालिका के अप्रयुक्त स्थान पर सीधा प्रभाव पड़ता है, क्योंकि डेटा को वर्दी और मिश्रित विस्तार के बीच फेरबदल किया जाता है। कुछ मामलों में, पृष्ठों में फेरबदल करते समय, डेटा फ़ाइल की ऑटो-ग्रोथ सेटिंग के कारण ऑपरेशन असंबद्ध स्थान को प्रेरित कर सकता है।

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

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

रैपिंग अप

  1. डेटाबेस निर्माण की प्रक्रिया में, परिभाषित आकार (अर्थात प्रारंभिक आकार है) डेटाबेस के वास्तविक आकार के अलावा और कुछ नहीं है। यह प्रारंभिक आकार पृष्ठ शीर्षलेख में दर्ज किया गया है। डेटाबेस सिकुड़ने की प्रक्रिया के दौरान, प्रक्रिया न्यूनतम आकार . का उपयोग करती है संपत्ति को संदर्भ के रूप में, केवल तभी जब वास्तविक डेटा आकार न्यूनतम आकार से कम हो—न्यूनतम आकार भी पेज हेडर में पाया जाता है, और इसे डीबीसीसी पेज कमांड का उपयोग करके देखा जा सकता है। साथ ही, यही प्रक्रिया DBCC SHRINKFILE के लिए अच्छी है, जो फाइलों को उनके शुरुआती आकार से कम कर देती है।
  2. डिस्क स्थान खाली करने के लिए डेटाबेस को सिकोड़ना अनुशंसित अभ्यास नहीं है, हालांकि, निर्णय परिदृश्य पर निर्भर करता है-असामान्य परिदृश्य एक अपरंपरागत कार्रवाई की गारंटी दे सकते हैं। हालाँकि, किसी को यह याद रखना चाहिए कि डेटाबेस को सिकोड़ना डेटाबेस में विखंडन का परिचय देता है। असंबद्ध स्थान . के मूल कारण का विश्लेषण करना हमेशा एक अच्छा अभ्यास है और अप्रयुक्त स्थान वस्तुओं की। कई मामलों में, डेटा वृद्धि को संभालने के लिए डिस्क का विस्तार करना एक व्यवहार्य/अनुशंसित विकल्प होगा।
  3. ऑटो-ग्रोथ कॉन्फ़िगरेशन:जब SQL सर्वर ऑटो-ग्रो ऑपरेशन करता है, तो ऑटो-ग्रो इवेंट को ट्रिगर करने वाले ट्रांजेक्शन को ऑटो-ग्रो इवेंट के पूरा होने तक इंतजार करना होगा। तभी लेन-देन स्वयं पूरा हो सकता है।
  4. हमेशा ऑटो-ग्रोथ विकल्पों को प्रतिशत के बजाय संख्याओं में सेट करने की अनुशंसा की जाती है।
  5. अप्रयुक्त स्थान को तालिका में शामिल करना निम्नलिखित कारणों से हो सकता है:
    • विखंडन
      जब डेटा अपनी प्रकृति और परिभाषा के प्रकार के कारण खंडित होता है, तो कुछ अप्रयुक्त स्थान उत्पन्न होता है। साथ ही, डेटा का बार-बार संशोधन (सभी अद्यतन, सम्मिलित करें या हटाएं संचालन) अधिक संख्या में पृष्ठ विभाजन की ओर ले जाता है, जिससे तालिका में अप्रयुक्त स्थान उत्पन्न होने की अधिक संभावना होती है।
    • टेबल पर कोई क्लस्टर इंडेक्स नहीं है
      हीप में विखंडन को कम करने के लिए, कोई क्लस्टर इंडेक्स बनाने के बारे में सोच सकता है मेज पर। इंडेक्स फ़्रेग्मेंटेशन को कम करने के लिए, avg_fragmentation_in_percent मान निर्धारित करके इंडेक्स रखरखाव करें।
    • डेटा का आकार
      कुछ मामलों में, उपयुक्त डेटा प्रकारों का उपयोग करने से छोटी डेटा पंक्तियाँ प्राप्त होती हैं जो बदले में एक पृष्ठ में अधिक पंक्तियों को रखने की अनुमति देती हैं। यह न केवल आंतरिक अप्रयुक्त स्थान को कम करता है बल्कि पृष्ठ विभाजन की संख्या को कम करके प्रदर्शन पर भी प्रभाव डालता है।
  6. अप्रयुक्त स्थान चर-लंबाई वाले कॉलम को छोड़ने का परिणाम भी हो सकता है। उपयोग किए गए स्थान को तुरंत पुनः प्राप्त करने के लिए तालिका या अनुक्रमित दृश्य में चर-लंबाई वाले स्तंभों में महत्वपूर्ण परिवर्तन करने के बाद DBCC CLEANTABLE का उपयोग करें। वैकल्पिक रूप से, आप तालिका या दृश्य पर अनुक्रमणिका का पुनर्निर्माण कर सकते हैं; हालांकि, यह अधिक संसाधन-गहन ऑपरेशन है।
  7. जब हम अपेक्षाकृत बड़ा डेटा (>8 KB) लोड करते हैं तो अप्रयुक्त स्थान अपेक्षाकृत बड़ा होता है। ऐसे मामलों में, हम डेटा पृष्ठों पर बड़ी मात्रा में अप्रयुक्त स्थान के साथ समाप्त हो जाते हैं।
  8. शेयरपॉइंट माइग्रेशन के बाद, डेटाबेस में पेश किए गए अप्रयुक्त स्थान की एक महत्वपूर्ण मात्रा को देखा जा सकता है। सुधार एक धीमी प्रक्रिया है, भूत सफाई प्रक्रिया इन पृष्ठों को हटा देती है और कुछ समय के बाद मुक्त हो जाती है।
  9. कुछ मामलों में, हो सकता है कि sp_spaceused का मान सही न हो। हालांकि sp_spaceused सिस्टम ऑब्जेक्ट से इसकी जानकारी प्राप्त करता है जो सभी अनुमान रखता है, यह कभी-कभी गलत हो सकता है। इसका एक कारण यह है कि डेटाबेस माइग्रेशन के दौरान, या पुराने आँकड़ों के मामले में, या जब सिस्टम बार-बार डीडीएल संशोधनों से गुजर रहा हो, या भारी मात्रा में कॉपी ऑपरेशन करने के बाद। सिस्टम ऑब्जेक्ट को सिंक्रोनाइज़ करने के लिए, DBCC updateusage(0) या DBCC CHECKTABLE स्टेटमेंट का उपयोग करके सुनिश्चित करें कि sp_spaceused अप-टू-डेट सटीक डेटा देता है। हालाँकि, याद रखें कि DBCC कमांड संसाधन-गहन हैं; इसके उपयोग के निहितार्थ की अच्छी समझ है। जब हम DBCC updateusage कमांड को निष्पादित करते हैं, SQL सर्वर डेटाबेस इंजन डेटाबेस में डेटा पृष्ठों को स्कैन करता है और sys.allocation_units में आवश्यक सुधार करता है। और sys.partitions प्रत्येक तालिका द्वारा उपयोग किए जाने वाले संग्रहण स्थान के बारे में कैटलॉग दृश्य।

संदर्भ

  • https://msdn.microsoft.com/en-us/library/cc280360.aspx
  • https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql
  • https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-files-transact-sql

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संग्रहीत कार्यविधि से चयन कैसे करें

  2. एक डेटाबेस मेल खाता बनाएँ (SSMS)

  3. SQL सर्वर के लिए कनेक्शन टाइमआउट

  4. SQL सर्वर में निर्देशांक (देशांतर/अक्षांश, Google मानचित्र से) संग्रहीत करने का सबसे अच्छा तरीका क्या है?

  5. SQL सर्वर में CHAR और VARCHAR में क्या अंतर है - SQL सर्वर / T-SQL ट्यूटोरियल भाग 31