आपके आकार के अनुमानों में, क्या आपने इंडेक्स द्वारा ली गई जगह की मात्रा को ध्यान में रखा है? यदि आपके पास ऐसे टेक्स्ट फ़ील्ड हैं जो मल्टी-बाइट ( N[VAR]CHAR
बजाय [VAR]CHAR
) के रूप में सेट किए गए हैं और इनपुट फाइलें UTF-8 या प्लेन एक-बाइट-प्रति-वर्ण हैं तो यह आपकी स्टोरेज आवश्यकताओं को दो के कारक तक बढ़ा देगा। इसके अलावा याद रखें कि यदि आपके पास एक मेज पर एक गुच्छेदार कुंजी / सूचकांक है, तो इसका आकार तालिका के अन्य सभी अनुक्रमों को प्रभावित करता है क्योंकि वे हर पंक्ति के लिए संकुल कुंजी मान शामिल करते हैं (इसलिए यदि तालिका में NCHAR है तो एक चरम उदाहरण देने के लिए (10) ) कुंजी जहां एक INT करता है और वह आपकी संकुल कुंजी / अनुक्रमणिका है जो आप न केवल डेटा पृष्ठों में प्रति पंक्ति अतिरिक्त 16 बाइट्स का उपयोग कर रहे हैं, आप उस तालिका के प्रत्येक अन्य सूचकांक में प्रति पंक्ति 16 बाइट बर्बाद भी करते हैं ) ।
इसके अलावा, कुछ स्थान आवंटित किया जाएगा, लेकिन अप्रयुक्त, या तो क्योंकि DB इंजन ने हटाए जाने के बाद आवंटित किए गए कुछ स्थान को छोड़ दिया है ताकि इसे उस तालिका में नए डेटा के लिए जल्दी से फिर से उपयोग किया जा सके या क्योंकि आवेषण और डिलीट का पैटर्न केवल कई पृष्ठों को छोड़ दिया है पूर्ण।
तुम दौड़ सकते हो:
SELECT o.name
, SUM(ps.reserved_page_count)/128.0 AS ReservedMB
, SUM(ps.used_page_count)/128.0 AS UsedMB
, SUM(ps.reserved_page_count-ps.used_page_count)/128.0 AS DiffMB
FROM sys.objects o
JOIN sys.dm_db_partition_stats ps ON o.object_id = ps.object_id
WHERE OBJECTPROPERTYEX(o.object_id, 'IsMSShipped') = 0
GROUP BY o.name
ORDER BY SUM(ps.reserved_page_count) DESC
तालिकाओं के लिए जगह ले रहे हैं पर एक त्वरित देखो पाने के लिए।
इसके अलावा EXEC sp_spaceused
डीबी दो परिणाम सेट लौटाएगा। पहली डेटा फ़ाइलों के लिए फाइलसिस्टम में आवंटित कुल स्थान को सूचीबद्ध करता है और उसमें से कितना असंबद्ध है, दूसरी सूची डेटा पृष्ठों के लिए कितना आवंटित स्थान का उपयोग करता है, सूचकांक पृष्ठों के लिए, या वर्तमान में अप्रयुक्त है।
sp_spaceused
किसी दिए गए ऑब्जेक्ट द्वारा उपयोग किए गए स्थान को भी वापस कर देगा, ताकि आप विश्लेषण के लिए एक तालिका बनाने के लिए इसे लूप कर सकें:
-- TEMP TABLES FOR ANALYSIS
CREATE TABLE #tTables (sName NVARCHAR(MAX), iRows BIGINT, iReservedKB BIGINT, iDataKB BIGINT, iIndexKB BIGINT, iUnusedKB BIGINT)
CREATE TABLE #tTmp (sName NVARCHAR(MAX), iRows BIGINT, sReservedKB NVARCHAR(MAX), sDataKB NVARCHAR(MAX), sIndexKB NVARCHAR(MAX), sUnusedKB NVARCHAR(MAX))
-- COLLECT SPACE USE PER TABLE
EXEC sp_msforeachtable 'INSERT #tTmp EXEC sp_spaceused [?];'
-- CONVERT NUMBER-AS-TEXT COLUMNS TO NUMBER TYPES FOR EASIER ANALYSIS
INSERT #tTables SELECT sName, iRows
, CAST(REPLACE(sReservedKB, ' KB', '') AS BIGINT)
, CAST(REPLACE(sDataKB , ' KB', '') AS BIGINT)
, CAST(REPLACE(sIndexKB , ' KB', '') AS BIGINT)
, CAST(REPLACE(sUnusedKB , ' KB', '') AS BIGINT)
FROM #tTmp
DROP TABLE #tTmp
-- DO SOME ANALYSIS
SELECT sName='TOTALS', iRows=SUM(iRows), iReservedKB=SUM(iReservedKB), iDataKB=SUM(iDataKB), iIndexKB=SUM(iIndexKB), iUnusedKB=SUM(iUnusedKB) FROM #tTables ORDER BY sName
SELECT * FROM #tTables ORDER BY iReservedKB DESC
-- CLEAN UP
DROP TABLE #tTables
उपरोक्त कोड एक सूची में सभी तालिका आकार, और कुल योग के लिए एक पंक्ति का उत्पादन करेगा। यदि आवश्यक हो तो आप विभिन्न सिस्टम दृश्यों का उपयोग कर सकते हैं (जैसे कि ऊपर दी गई पहली क्वेरी में उपयोग किया जाता है , sys.objects
और अधिक विवरण प्राप्त करने के लिए http://technet.microsoft.com/en-us/library/ms177862.aspxsys.dm_db_partition_stats
देखें ) प्रत्येक सूचकांक द्वारा उपयोग किया जाने वाला स्थान।
डेटा फ़ाइल में अप्रयुक्त स्थान के तीन वर्ग हैं:
- वह जो किसी चीज़ के लिए आवंटित नहीं किया गया है (यह पहले परिणाम
sp_spaceused
में कोई वस्तु निर्दिष्ट नहीं से पता चलता है )
- वह जो किसी ऑब्जेक्ट (आरक्षित) को आवंटित किया गया है, लेकिन वर्तमान में उपयोग नहीं किया गया है (यह
sp_spaceused
आउटपुट में "अप्रयुक्त" गिनती में दिखाता है ।
- वह भाग-उपयोग किए गए पृष्ठों में बंद है (यह सब कुछ के रूप में उपयोग करने के लिए उपयोग किया जाएगा, जो एकल पृष्ठ भाग में आवंटित किया गया है, एक पृष्ठ 8,192 बाइट्स लंबा है)। यह पता लगाना / गणना करना कठिन है। यह दो कारकों के मिश्रण के कारण है:
- स्प्लिट पेज। जैसा कि डेटा जोड़ा जाता है आप अक्सर भाग खाली पन्नों के साथ समाप्त हो जाते हैं (भंडारण इंजन हमेशा पृष्ठ सामग्री को सामान्य कर सकता है , लेकिन यह बहुत अक्षम होगा), और पंक्तियों को हटा दिया जाता है पृष्ठ सामग्री स्वचालित रूप से पैक नहीं की जाती है (फिर से वे हो सकते हैं, लेकिन अतिरिक्त आई / ओ लोड आम तौर पर है अब तक इसके लायक) से।
- भंडारण इंजन कई पृष्ठों पर एक पंक्ति को विभाजित नहीं करेगा (यह पृष्ठ आकार के साथ जहां 8,192 बाइट-प्रति-पंक्ति सीमा आती है)। यदि आपकी पंक्तियां निश्चित आकार की हैं और प्रत्येक में 1,100 बाइट्स हैं, तो आप उस टेबल पर आवंटित प्रत्येक डेटा ब्लॉक के कम से कम 492 बाइट्स को "बर्बाद" करने जा रहे हैं (7 पंक्तियां 7,700 बाइट्स लेती हैं और एक 8 वें फिट नहीं होगा इसलिए बचे हुए बाइट्स जीत गए ' t का उपयोग किया जाए)। पंक्तियाँ जितनी व्यापक होंगी, यह उतना ही बुरा हो सकता है। चर / अनुक्रमित चर लंबाई पंक्तियों के साथ (जो पूरी तरह से तय लंबाई की तुलना में कहीं अधिक सामान्य हैं) आम तौर पर बेहतर (लेकिन इस मामले की गणना करने के लिए कम आसान हैं)।
यहाँ एक और चेतावनी बड़ी वस्तुओं ( TEXT
कॉलम,[N]VARCHAR(MAX)
एक निश्चित आकार और इतने पर) के रूप में वे ऑफ-पेज रखा जाता है, तो बस मुख्य पंक्ति डेटा में 8 बाइट्स को कहीं और डेटा के लिए एक पॉइंटर रखने के लिए) तो 8,192 बाइट्स-प्रति-पंक्ति-सीमा को तोड़ सकते हैं।
tl; dr: आरंभिक डेटाबेस के आकार का अनुमान लगाना बहुत अधिक शामिल हो सकता है, क्योंकि शुरुआत में यह स्वाभाविक है।