2009-04-21 16 views
12

मेरे पास एक परिदृश्य है जहां प्रत्येक उपयोगकर्ता को 2 जीबी डेटाबेस स्पेस आवंटित किया गया है। अब मुझे अपने आवंटित स्थान के पेर्सनेट का उपयोग करना है, ऐसा करने के लिए मुझे तालिका में एकल रिकॉर्ड के आकार को जानने की आवश्यकता है।एक रिकॉर्ड का आकार? एसक्यूएल

मैंने sp_spaceused का उपयोग करने की कोशिश की है और यहां तक ​​कि प्रसव के उपयोग के लिए एक कस्टम प्रक्रिया भी लिखी है .. लेकिन वे अपने परिणाम में विशाल अंतर दिखाते हैं।

क्या यह चीज़ सही करने के लिए कोई रास्ता है।

+0

क्या इस "अंतरिक्ष" के लिए प्रयोग किया जाता है? –

+2

आप अपने उपयोगकर्ता डेटा को कैसे विभाजित कर रहे हैं? क्या यह सब एक ही टेबल में है? या क्या प्रत्येक उपयोगकर्ता की अपनी टेबल होती है? –

+0

मेरे पास एक सारणी है जहां सभी उपयोगकर्ता डेटा सहेजा जाता है। UserId का प्रयोग व्यक्तिगत उपयोगकर्ता डेटा को अलग करने के लिए किया जाता है –

उत्तर

0

डाटाबेस के लिए नामित निर्देशिकाओं में डिस्क पर डेटा सहेजा जाता है। इसमें सब कुछ शामिल है, जिसमें आप माप नहीं रहे हैं (सूचकांक, आदि)। इसका आकलन करें।

+0

उन संकेतों को मापने के लिए कैसे उपयोगी होगा –

10

आप एक जटिल जटिल सूत्र के साथ एक पंक्ति (पंक्तियों की संख्या) की गणना कर सकते हैं। सटीक विवरण के लिए Books Online (एमएस-सहायता: //MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/81fd5ec9-ce0f-4c2c-8ba0-6c483cea6c75.htm) देखें।

संक्षेप में:

स्तंभों की संख्या ले लो और निश्चित लंबाई डेटाटाइप्स के लिए अपने डेटा-प्रकार प्रत्येक स्तंभ का आकार निर्धारित।

किसी भी नल स्तंभों के लिए इस्तेमाल अंतरिक्ष की गणना फिर rowspace गणना:

Row_Size = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

+1

उत्कृष्ट पुस्तकें ऑनलाइन लिंक, धन्यवाद। – DenNukem

24

अपनी मेज नाम के साथ भागो DBCC SHOWCONTIG

dbcc showcontig ('TableName') with tableresults 

तो देखो अधिकतम न्यूनतम और औसत रिकॉर्ड आकार

+6

क्या है कि की इकाई आप का उल्लेख आकार है वे KB या बी – semirturgay

+0

https://msdn.microsoft.com/en-us/library/ms175008.aspx हैं - इस को देखते हुए मेरा मानना ​​है कि यह आपकी जानकारी के बाइट्स – JsonStatham

+0

है, के अनुसार लिंक किया गया एमएसडीएन पृष्ठ: "यह सुविधा माइक्रोसॉफ्ट एसक्यूएल सर्वर के भविष्य के संस्करण में हटा दी जाएगी। इस सुविधा का उपयोग नए विकास कार्यों में न करें, और वर्तमान में इस सुविधा का उपयोग करने वाले अनुप्रयोगों को संशोधित करें। इसके बजाय sys.dm_db_index_physical_stats का उपयोग करें।" – DaveD

11

निम्न क्वेरी आपको @SpaceAllotted का प्रतिशत बताएं जिसका उपयोग डेटा द्वारा डेटाबेस के ऑब्जेक्ट्स द्वारा कितने पृष्ठों को आवंटित किया जाता है, यह देखकर किया जा रहा है।

पंक्ति-स्तर पर उपयोग को मापने का प्रयास करने योग्य नहीं है, क्योंकि SQL सर्वर सीमा-स्तर पर सभी स्थान आवंटित करता है। प्रत्येक सीमा आठ 8 केबी डेटा पृष्ठों से बना है। तो यदि आपके डेटाबेस में केवल एक पंक्ति थी, और उस पंक्ति में 4 बाइट डेटा थे, तो पूरी सीमा को अभी भी 4 बाइट्स (या एक मौजूदा हद तक आवंटित पृष्ठों के साथ आवंटित करने के लिए आवंटित करने की आवश्यकता होगी। इसे मिश्रित सीमा कहा जाता है।)।

DECLARE @SpaceAllotted  FLOAT 
-- 2MB converted to kilobytes... 
SET  @SpaceAllotted = 2048 

SELECT 
    -- Allocation is done on the extent-level. 
    -- Each extent contains eight 8KB data pages. 
    ((1/(@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT)/8) * 64) * 100 AS PercentageUsed 
FROM 
    [sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips 
    -- This will allow us to retrieve the page count of all tables in the 
    -- current database, regardless of whether or not they have clustered 
    -- indexes and/or non-clustered indexes. 
INNER JOIN 
    [sys].[indexes] i 
    ON 
     [ips].[object_id] = [i].[object_id] 
    AND [ips].[index_id] = [i].[index_id] 

जब से हम मिश्रित विस्तार करने की संभावना है, और कोई अच्छा रास्ता (वहाँ तरीके हैं, लेकिन वे बहुत होने के लिए नहीं जा रहे हैं) का निर्धारण क्या पृष्ठों क्या विस्तार करने के लिए आवंटित कर रहे हैं, इस isn 100% सटीक नहीं है। इसके अतिरिक्त, एक्सेंट्स में मुफ्त पेज भी हो सकते हैं (जो आरक्षित हैं और इसलिए डिस्क स्थान ले रहे हैं), इसलिए आमतौर पर, यह अनुमान हमेशा कम हो जाएगा। हालांकि, पृष्ठ स्तर पर डेटाबेस का निरीक्षण करने के लिए कुछ लिखने के बिना शायद यह सबसे अच्छा है।

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

  • कोई अधिकतम आकार डेटाबेस के लिए निर्दिष्ट (autogrowth सक्षम और अप्रतिबंधित है) देता है तो ऐसा, उड़ नहीं होगा क्योंकि MAX_SIZE रूप -1 लौटा दी जाएगी।
  • फिर, हम सही ढंग से निर्धारित नहीं कर सकता कितनी जगह वास्तविक डेटा द्वारा किया जाता है। यहां हम देख रहे हैं कि फ़ाइल सिस्टम पर वास्तव में कितनी जगह उपयोग की जाती है।
  • हम लॉग फ़ाइल स्थान नहीं देख रहे हैं। हां, यह अभी भी डिस्क स्पेस का उपभोग करता है।

आशा इनमें से किसी एक को अपनी समस्या का हल।

SELECT 
    ((1/CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed 
FROM 
    [sys].dm_io_virtual_file_stats(DB_ID(), NULL) vfs 
INNER JOIN 
    [sys].[database_files] df 
    ON 
     [vfs].[file_id] = [df].[file_id] 
WHERE 
    [df].[type] = 0 
+0

इच्छा है कि मैं आपके लिए एक से अधिक बार मतदान कर सकता हूं। :-) –

11

के बाद से SHOWCONTIG पदावनत किया जा रहा है, आप भी उपयोग कर सकते हैं:

SELECT * FROM sys.dm_db_index_physical_stats 
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED') 
संबंधित मुद्दे