2010-10-13 9 views
56

आप कैसे बता सकते हैं कि SQL सर्वर 2005 डेटाबेस में टेबल्स सबसे अधिक स्थान ले रहे हैं?आप कैसे बता सकते हैं कि SQL सर्वर 2005 डेटाबेस में टेबल्स सबसे अधिक स्थान ले रहे हैं?

मुझे यकीन है कि कुछ सिस्टम संग्रहीत प्रक्रिया है जो यह जानकारी दिखाती है।

मेरे पास एक परीक्षण डेटाबेस है जो 1Tb से 23tb तक बढ़ता है। वर्तमान में हम डेटाबेस में बहुत से ग्राहक रूपांतरण परीक्षण कर रहे हैं, जिसमें एक ही रूपांतरण संग्रहीत प्रक्रिया को कई बार चलाना शामिल है। यह DELETEs करता है जो मुझे यकीन है कि लेनदेन लॉग बढ़ रहा है। लेकिन यह मुझे इस सवाल पूछने के लिए सोच गया।

अग्रिम धन्यवाद।

+1

Marc_S और बैरी जवाब जहां सिर्फ बकाया तो मैं उन दोनों को upvoted और देखने के लिए जो एक सबसे upvotes मिला तो मैं इनाम सकता है कि एक इंतज़ार कर रहा था के लिए तालिका द्वारा डिस्क उपयोग "स्वीकृत उत्तर"। लेकिन वे दोनों 5 पर बंधे थे इसलिए मैंने अभी एक चुना लेकिन मैंने दोनों का इस्तेमाल किया। बहुत धन्यवाद Marc_S और बैरी! –

उत्तर

145

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

SELECT 
t.NAME AS TableName, 
i.name AS indexName, 
SUM(p.rows) AS RowCounts, 
SUM(a.total_pages) AS TotalPages, 
SUM(a.used_pages) AS UsedPages, 
SUM(a.data_pages) AS DataPages, 
(SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, 
(SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, 
(SUM(a.data_pages) * 8)/1024 AS DataSpaceMB 
FROM 
sys.tables t 
INNER JOIN 
sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN 
sys.allocation_units a ON p.partition_id = a.container_id 
WHERE 
t.NAME NOT LIKE 'dt%' AND 
i.OBJECT_ID > 255 AND 
i.index_id <= 1 
GROUP BY 
t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
OBJECT_NAME(i.object_id) 
+5

+1 शानदार। ध्यान दें कि इसमें डेटा इंडेक्स का आकार शामिल नहीं है। मेरे लिए, हालांकि, यह काम पूरा हो गया। –

+18

मुझे यह नहीं पता था, लेकिन यदि आप प्रबंधन स्टूडियो का उपयोग कर रहे हैं तो आप डेटाबेस पर राइट क्लिक भी कर सकते हैं और उसी परिणाम के लिए तालिका द्वारा रिपोर्ट उपयोग>> डिस्क उपयोग पर जा सकते हैं। – rossisdead

+0

@rossisdead, यह जानने के लिए जानकारी का उल्लसित टुकड़ा है। धन्यवाद! – Nickmaovich

30

उपयोग sp_spacedUsed

Exec sp_spaceused N'YourTableName'

या यदि आप अपने डेटाबेस में प्रत्येक तालिका के लिए sp_spaceused पर अमल करना चाहते हैं तो आप इस एसक्यूएल का उपयोग कर सकते हैं:

set nocount on 
create table #spaceused (
    name nvarchar(120), 
    rows char(11), 
    reserved varchar(18), 
    data varchar(18), 
    index_size varchar(18), 
    unused varchar(18) 
) 

declare Tables cursor for 
    select name 
    from sysobjects where type='U' 
    order by name asc 

OPEN Tables 
DECLARE @table varchar(128) 

FETCH NEXT FROM Tables INTO @table 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    insert into #spaceused exec sp_spaceused @table 
    FETCH NEXT FROM Tables INTO @table 
END 

CLOSE Tables 
DEALLOCATE Tables 

select * from #spaceused 
drop table #spaceused 

exec sp_spaceused 

ऊपर एसक्यूएल से here

+6

SQL सर्वर के नए संस्करणों के लिए आप 'exec sp_msforeachtable' exec sp_spaceused n ''? '' ' – JNK

+0

@JNK - गुड प्वाइंट – codingbadger

+1

@JNK 'sp_msforeachtable' कम से कम SQl Server 2000 – SQLMenace

1

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

आप प्रबंधन स्टूडियो उपयोग कर रहे हैं (ओपी नहीं एक कोड स्निपेट के लिए पूछने के लिए किया था) आप कर सकते हैं डेटाबेस पर भी राइट क्लिक करें और रिपोर्ट करने के लिए जाने -> एक ही परिणाम

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