2009-05-27 16 views
8

मुझे अपने एसक्यूएल 2008 सर्वर में लगभग 10 टेबल मिल गए हैं।क्या आपके डेटाबेस टेबल के आकार/आकार को खोजने का कोई तरीका है?

वर्तमान में, मेरा एमडीएफ लगभग 3.5 गीगा है। (मेरे पास कुछ तालिकाओं में कुछ बाइनरी डेटा भी है)। तो, मैं सोच रहा हूं कि क्या कोई तरीका है कि मैं देख सकता हूं कि कौन सी टेबल आकार में सबसे बड़ी हैं।

क्या यह संभव है?

शायद यह एक इंडेक्स या एफटीएस कैटलॉग है?

उत्तर

11

रन इस: ब्लॉग

पार्स करने के लिए कोड संपादित

/****************************************************************************** 
** File: “GetTableSpaceUseage.sql” 
** Name: Get Table Space Useage for a specific schema 
** Auth: Robert C. Cain 
** Date: 01/27/2008 
** 
** Desc: Calls the sp_spaceused proc for each table in a schema and returns 
**  the Table Name, Number of Rows, and space used for each table. 
** 
** Called by: 
**  n/a – As needed 
** 
** Input Parameters: 
**  In the code check the value of @schemaname, if you need it for a 
**  schema other than dbo be sure to change it. 
** 
** Output Parameters: 
**  NA 
*******************************************************************************/ 

/*—————————————————————————*/ 
/* Drop the temp table if it's there from a previous run      */ 
/*—————————————————————————*/ 
if object_id(N'tempdb..[#TableSizes]') is not null 
    drop table #TableSizes ; 
go 

/*—————————————————————————*/ 
/* Create the temp table              */ 
/*—————————————————————————*/ 
create table #TableSizes 
    (
    [Table Name] nvarchar(128) /* Name of the table */ 
    , [Number of Rows] char(11) /* Number of rows existing in the table. */ 
    , [Reserved Space] varchar(18) /* Reserved space for table. */ 
    , [Data Space] varchar(18) /* Amount of space used by data in table. */ 
    , [Index Size] varchar(18) /* Amount of space used by indexes in table. */ 
    , [Unused Space] varchar(18) /* Amount of space reserved but not used. */ 
) ; 
go 

/*—————————————————————————*/ 
/* Load the temp table              */ 
/*—————————————————————————*/ 
declare @schemaname varchar(256) ; 
-- Make sure to set next line to the Schema name you want! 
set @schemaname = 'dbo' ; 

-- Create a cursor to cycle through the names of each table in the schema 
declare curSchemaTable cursor 
    for select sys.schemas.name + '.' + sys.objects.name 
     from sys.objects 
      , sys.schemas 
     where object_id > 100 
       and sys.schemas.name = @schemaname 
       /* For a specific table uncomment next line and supply name */ 
       --and sys.objects.name = 'specific-table-name-here'  
       and type_desc = 'USER_TABLE' 
       and sys.objects.schema_id = sys.schemas.schema_id ; 

open curSchemaTable ; 
declare @name varchar(256) ; /* This holds the name of the current table*/ 

-- Now loop thru the cursor, calling the sp_spaceused for each table 
fetch curSchemaTable into @name ; 
while (@@FETCH_STATUS = 0) 
    begin  
    insert into #TableSizes 
      exec sp_spaceused @objname = @name ;  
    fetch curSchemaTable into @name ; 
    end 

/* Important to both close and deallocate! */ 
close curSchemaTable ;  
deallocate curSchemaTable ; 


/*—————————————————————————*/ 
/* Feed the results back              */ 
/*—————————————————————————*/ 
select [Table Name] 
     , [Number of Rows] 
     , [Reserved Space] 
     , [Data Space] 
     , [Index Size] 
     , [Unused Space] 
from [#TableSizes] 
order by [Table Name] ; 

/*—————————————————————————*/ 
/* Remove the temp table              */ 
/*—————————————————————————*/ 
drop table #TableSizes ; 

takenRobert Caine से, कई वर्ण कि एकल उद्धरण में थे एक विशेष एकल उद्धरण, के रूप में अच्छी तरह से इस्तेमाल -- संकेत। के लिए Microsoft SQL 2005+

+2

पवित्र रॉकेट शिप बैटमैन सक्षम बनाता है! –

+0

क्या यह स्क्रिप्ट माइक्रोसॉफ्ट एसक्यूएल सर्वर के लिए है? जब मैं इसे पार्स-चेक करता हूं तो मुझे त्रुटियों का स्कोर मिलता है। –

+0

(पवित्र रॉकेट शिप बैटमैन! - जोशुआ बेल्डेन) - नरक हां !!! – kevchadders

5
exec sp_spaceused <tablename> 
+1

मानकों के बिना इस का उपयोग कर अपने डेटाबेस आकार, सूचकांक आकार, आदि मिल जाएगा अगर यानी के साथ दिया। exec sp_spaceused 'sometable'। यह आपको पंक्ति गणना, डेटा आकार और तालिका का सूचकांक आकार – pirho

+0

प्रदान करेगा, कृपया आरक्षित और डेटा के बीच क्या अंतर है? –

+0

आरक्षित तालिका के लिए आरक्षित डिस्क स्थान आरक्षित है। डेटा तालिका में डेटा द्वारा उपयोग की जाने वाली जगह की कुल मात्रा है। – pirho

6
exec sp_spaceused [tablename] 
+0

वर्ग ब्रैकेट पर अच्छी कॉल। यह कभी विफल नहीं होता है, मैं कोण ब्रैकेट का उपयोग करता हूं, इंडेंट करना भूल जाता हूं, और वे गायब हो जाते हैं। गरर। अंत में इंटरनेट कब पता चलेगा कि मैं क्या करने की कोशिश कर रहा हूं? –

+0

स्क्वायर ब्रैकेट और एंग्लेड ब्रैकेट्स (जोश के उत्तर के साथ, ऊपर) के बीच अंतर क्या है? –

+1

मुझे एंग्लेड ब्रैकेट्स के बारे में निश्चित नहीं है, लेकिन स्क्वायर ब्रैकेट "मज़ेदार" टेबल नाम (आरक्षित शब्द, तालिका नामों में रिक्त स्थान इत्यादि ...) – ChrisHDog

2

कभी कभी मैं इस चलाने

इस कोड है ... यह, अस्थायी तालिका में सभी तालिकाओं हो जाता है इसके माध्यम से लूप और सभी तालिकाओं के लिए आकार हो जाता है। परिणाम डेटा @tablesizes में है, इसलिए आप यह पूछ सकते हैं कि आप कैसा पसंद करते हैं। Sql सर्वर> 2005

declare @tables TABLE 
(
    table_name nvarchar(200) 
) 

declare @tablesizes TABLE 
(
    [name] nvarchar(200), 
    [rows] int, 
    reserved nvarchar(200), 
    data nvarchar(200), 
    index_size nvarchar(200), 
    unused nvarchar(200), 
    reserved_int int, 
    data_int int, 
    index_size_int int, 
    unused_int int 
) 

declare @t nvarchar(200) 

insert into @tables 
select Table_Name from information_schema.tables 

while exists(select * from @tables) 
begin 
    set @t=(select top 1 table_name from @tables) 

    insert into @tablesizes([name],[rows],reserved,data,index_size,unused) 
    exec sp_spaceused @t 

    delete top (1) from @tables 
end 

update @tablesizes set 
reserved_int=convert(int, replace(reserved,' KB','')), 
data_int=convert(int, replace(data,' KB','')), 
index_size_int=convert(int, replace(index_size,' KB','')), 
unused_int=convert(int, replace(unused,' KB','')) 

select * from @tablesizes order by data_int desc 
6

sys.allocations_units में

वर्क्स जानकारी की आवश्यकता है। विभाजन के सभी आवंटन इकाइयों को समूहबद्ध करने के लिए आप sys.partitions के साथ जुड़ें और गूढ़ आवंटन_unit_id की बजाय अधिक उपयोग करने योग्य ऑब्जेक्ट_आईड प्राप्त करने के लिए भी शामिल हों।

select object_name(p.object_id), 
    sum(au.total_pages)*8 as [space_in_kb] 
    from sys.partitions p 
    join sys.allocation_units au on p.hobt_id = au.container_id 
    group by p.object_id 
    order by [space_in_kb] desc 

और हाँ, सभी तालिकाओं (ढेर या क्लस्टर) 'partitions' कर रहे हैं, मामले विभाजित तालिकाओं का उल्लेख नहीं करता। sys.partitions में 'पंक्तियां' कॉलम भी है जो आपकी रूचि रख सकता है।

+0

यह एक सारांश के लिए एक महान स्क्रिप्ट है :) –

3

यह क्वेरी वर्तमान डेटाबेस में प्रत्येक तालिका का आकार दिखाती है।

SELECT sysobjects.[name] AS [TableName], 
    SUM(sysindexes.reserved) * 8 AS [Size(KB)], 
    SUM(sysindexes.dpages) * 8 AS [Data(KB)], 
    (SUM(sysindexes.used) - SUM(sysindexes.dpages)) * 8 AS [Indexes(KB)], 
    (SUM(sysindexes.reserved) - SUM(sysindexes.dpages)) * 8 AS [Unused(KB)] 
FROM dbo.sysindexes AS sysindexes 
    JOIN dbo.sysobjects AS sysobjects ON sysobjects.id = sysindexes.id 
WHERE sysobjects.[type] = 'U' 
GROUP BY sysobjects.[name] 
ORDER BY [Size(KB)] DESC 
3

एसक्यूएल में 2008 +: SSMS में डीबी नाम पर राइट क्लिक करें, Reports, तो Standard Reports, तो Disk Usage by Table का चयन करें।

0

आप इस्तेमाल कर सकते हैं:

SELECT @@servername; 

IF EXISTS(SELECT name FROM tempdb.sys.tables WHERE name LIKE '#spaceUsed%') 
    BEGIN 
     DROP TABLE #spaceUsed; 
    END; 
CREATE TABLE #spaceUsed (
name VARCHAR(255) , 
rows INT , 
reserved VARCHAR(50) , 
data VARCHAR(50) , 
index_size VARCHAR(50) , 
unused VARCHAR(50)); 

EXEC sp_msforeachtable 
@command1 =' 
-- 
INSERT INTO #spaceUsed 
exec sp_spaceused N''?''; 
' 
,@whereand = ' And Object_id In (Select Object_id From sys.objects 
Where SCHEMA_NAME(Schema_ID) like ''%'')'; 

DECLARE 
    @spaceUsedData TABLE (
    name VARCHAR(255) , 
    rows INT , 
    reservedMB BIGINT NULL , 
    dataMB BIGINT NULL , 
    index_sizeMB BIGINT NULL , 
    unusedMB BIGINT NULL); 

INSERT INTO INTO @spaceUsedData (name , rows , reservedMB , dataMB ,index_sizeMB ,unusedMB) 
SELECT     name , rows , 
Convert (BIGINT ,Ltrim(Rtrim(Replace(reserved ,'KB' ,''))))/1024 , 
Convert (BIGINT ,Ltrim(Rtrim(Replace(data ,'KB' ,''))))/1024 , 
Convert (BIGINT ,Ltrim(Rtrim(Replace(index_size ,'KB' ,''))))/1024 , 
Convert (BIGINT ,Ltrim(Rtrim(Replace(unused ,'KB' ,''))))/1024 
FROM #spaceUsed; 

SELECT * , reservedMB+ dataMB+index_sizeMB+unusedMB AS TotalMB FROM @spaceUsedData 
ORDER BY rows DESC; 
संबंधित मुद्दे

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