2009-05-27 8 views

Répondre

11

run ceci:

/****************************************************************************** 
** 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 ; 

taken de Robert Caine Blog

édité le code pour analyser, plusieurs caractères qui étaient en guillemet simple utilisé une citation spéciale unique, ainsi que la -- signe.

Ce code est pour Parfois, je cours cette Microsoft SQL 2005+

+2

Holy Rocket Ship Batman! –

+0

Est-ce script pour Microsoft Sql Server? Je reçois une vingtaine d'erreurs quand je l'analyse. –

+0

(Batman Holy Rocket Batman! - Joshua Belden) - Enfer Oui !!! – kevchadders

5
exec sp_spaceused <tablename> 
+1

en utilisant ce sans paramètres seront obtenir votre taille de base de données, la taille des index, etc. si on leur donne avec ie. exec sp_spaceused 'sometable'. Il vous donnera le nombre de lignes, la taille des données et la taille de l'index de la table – pirho

+0

quelle est la différence entre RÉSERVÉ et DONNÉES, s'il vous plaît? –

+0

réservé est l'espace disque réservé pour la table. les données sont la quantité totale d'espace utilisée par les données dans le tableau. – pirho

6
exec sp_spaceused [tablename] 
+0

Bon appel sur les crochets. Ça ne manque jamais, j'utilise les équerres, je oublie de mettre en retrait et elles disparaissent. grrr. Quand Internet va-t-il enfin savoir ce que j'essaie de faire? –

+0

quel est le diff entre les crochets et les parenthèses inclinées (avec la réponse de Josh, ci-dessus)? –

+1

Je ne suis pas sûr à propos des parenthèses inclinées, mais les crochets permettent des noms de table "drôles" (mots réservés, espaces dans les noms de table, etc ...) – ChrisHDog

2

... Il obtient toutes les tables de table temporaire, des boucles à travers et obtient des tailles pour toutes les tables. Les données de résultat sont dans @tablesizes, vous pouvez donc l'interroger comme vous le souhaitez.

Works dans Sql Server> 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 a les informations dont vous avez besoin. Vous vous joignez à sys.partitions pour regrouper toutes les unités d'allocation d'une partition et également pour obtenir l'ID d'objet plus utilisable plutôt que l'attribut_unit_id d'allocation ésotérique.

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 

Et oui, toutes les tables (ou tas) sont regroupés 'partitions', les termes ne font pas référence à des tables partitionnées. sys.partitions a aussi la colonne 'rows' qui peut vous intéresser.

+0

c'est un excellent script pour un seul résumé :) –

3

Cette requête affiche la taille de chaque table de la base de données en cours.

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

Dans SQL 2008+: clic droit sur le nom DB dans SSMS, sélectionnez Reports, puis Standard Reports, puis Disk Usage by Table.

0

Vous pouvez utiliser:

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; 
Questions connexes