Logo

20/05/2012

Supporto OnLine

Supporto Tecnico OnLine

Prima di accedere contattare i nostri tecnici per attivare la sessione

SQL: Determining space used by table in database PDF Stampa E-mail

Nella gestione di SQL spesso ci si trova a dover capire quali tabelle all'interno di un database occupano spazio e quanto ne occupano.

Il seguente script permette di ottenere un output con relativi dettagli (conteggio righe, spazio occupato, spazio indici, ecc...)

 

 

SQL Server 2000 or 2005

 

DECLARE @table_name VARCHAR(500
DECLARE @schema_name VARCHAR(500
DECLARE @tab1 TABLE(
        
tablename VARCHAR (500collate database_default
       
,schemaname VARCHAR(500collate database_default
)

CREATE TABLE #temp_Table (
        
tablename sysname
       
,row_count INT
       
,reserved VARCHAR(50collate database_default
       
,data VARCHAR(50collate database_default
       
,index_size VARCHAR(50collate database_default
       
,unused VARCHAR(50collate database_default 
)

INSERT INTO @tab1 
SELECT Table_NameTable_Schema 
FROM information_schema.tables 
WHERE TABLE_TYPE 'BASE TABLE'

DECLARE c1 CURSOR FOR
SELECT 
Table_Schema '.' Table_Name  
FROM information_schema.tables t1 
WHERE TABLE_TYPE 'BASE TABLE'

OPEN c1
FETCH NEXT FROM c1 INTO @table_name
WHILE @@FETCH_STATUS 
BEGIN  
        SET 
@table_name REPLACE(@table_name'[',''); 
        
SET @table_name REPLACE(@table_name']',''); 

        
-- make sure the object exists before calling sp_spacedused
        
IF EXISTS(SELECT id FROM sysobjects WHERE id OBJECT_ID(@table_name))
        
BEGIN
               INSERT INTO 
#temp_Table EXEC sp_spaceused @table_namefalse;
       
END
        
        FETCH 
NEXT FROM c1 INTO @table_name
END
CLOSE 
c1
DEALLOCATE c1

SELECT  t1.*
       ,
t2.schemaname 
FROM #temp_Table t1 
INNER JOIN @tab1 t2 ON (t1.tablename t2.tablename )
ORDER BY schemaname,t1.tablename;

DROP TABLE #temp_Table

SQL Server 2005

 

BEGIN try 
DECLARE @table_name VARCHAR(500) ; 
DECLARE @schema_name VARCHAR(500) ; 
DECLARE @tab1 TABLE(
        
tablename VARCHAR (500collate database_default
,       schemaname VARCHAR(500collate database_default
); 
DECLARE  @temp_table TABLE (    
        
tablename sysname
,       row_count INT
,       reserved VARCHAR(50collate database_default
,       data VARCHAR(50collate database_default
,       index_size VARCHAR(50collate database_default
,       unused VARCHAR(50collate database_default 
); 

INSERT INTO @tab1 
SELECT t1.name
,       t2.name 
FROM sys.tables t1 
INNER JOIN sys.schemas t2 ON t1.schema_id t2.schema_id );   

DECLARE c1 CURSOR FOR 
SELECT 
t2.name '.' t1.name  
FROM sys.tables t1 
INNER JOIN sys.schemas t2 ON t1.schema_id t2.schema_id );   

OPEN c1
FETCH NEXT FROM c1 INTO @table_name;
WHILE @@FETCH_STATUS 
BEGIN  
        SET 
@table_name REPLACE(@table_name'[',''); 
        
SET @table_name REPLACE(@table_name']',''); 

        
-- make sure the object exists before calling sp_spacedused
        
IF EXISTS(SELECT OBJECT_ID FROM sys.objects WHERE OBJECT_ID OBJECT_ID(@table_name))
        
BEGIN
                INSERT INTO 
@temp_table EXEC sp_spaceused @table_namefalse ;
        
END
        
        FETCH 
NEXT FROM c1 INTO @table_name
END
CLOSE c1
DEALLOCATE c1
SELECT t1.*
,       
t2.schemaname 
FROM @temp_table t1 
INNER JOIN @tab1 t2 ON (t1.tablename t2.tablename )
ORDER BY  schemaname,tablename;
END try 
BEGIN catch 
SELECT -100 AS l1
,       ERROR_NUMBER() AS tablename
,       ERROR_SEVERITY() AS row_count
,       ERROR_STATE() AS reserved
,       ERROR_MESSAGE() AS data
,       AS index_sizeAS unusedAS schemaname 
END catch