¿Cómo determino el tamaño de mi base de datos de SQL Server?

29

Básico: ¿cuál es el tamaño en el disco de mi MS SQL Server DB?
Más: ¿puedo ver rápidamente dónde están los datos? es decir, qué tablas, registros, etc.

adambox
fuente
¿Qué versión de SQL?
SQLChicken
Esta es una pregunta programática, ¡muestra estar en StackOverflow! leer: stackoverflow.com/questions/914182
balexandre
1
Estoy en desacuerdo. Es fundamentalmente una pregunta de administrador de sistemas. ¿Por qué les importa a los programadores si el servidor se queda sin espacio en disco?
Nick Kavadias
2
Estoy de acuerdo con Nick Es una o una pregunta. Las preguntas de DBA definitivamente pertenecen aquí.
Squillman
Es a la vez: a los programadores les importa manejar la excepción si el DB se queda sin espacio utilizable; Los administradores de sistemas se preocupan por razones obvias. :)
JYelton

Respuestas:

35

Probablemente quiera comenzar con el comando sp_spaceused.

Por ejemplo:

sp_spaceused Devuelve información sobre el tamaño total de la base de datos

sp_spaceused 'MyTable' Devuelve información sobre el tamaño de MyTable

Lea los documentos sobre todas las cosas sobre las que puede obtener información. También puede usar el comando sp_msforeachtable para ejecutar sp_spaceused en todas las tablas a la vez.

Editar: tenga en cuenta que el comando a veces devuelve múltiples conjuntos de datos, cada conjunto que contiene una porción diferente de estadísticas.

David
fuente
Solo para agregar una nota, sp_spaceused devuelve el número de páginas de 8 KB que ocupan los archivos de la base de datos.
Dario Solera
3
Si su base de datos es 2000, es posible que deba ejecutar DBCC UPDATEUSAGE para obtener los números correctos aquí. Siempre debe ser correcto en 2005
Nick Kavadias
16

La forma más fácil (¡sin escribir!): En SQL 2005/8 de Management Studio, haga clic con el botón derecho en la base de datos, seleccione Informes, Informes estándar, Uso de disco (también por tablas superiores, tabla y partición).

usuario3047
fuente
1

Puedes ver los archivos físicos en sys.database_files. Esto tiene la ruta al archivo y el tamaño (en bloques IIRC).

sp_spaceused le mostrará cuánto espacio ocupa un objeto individual.

Preocupado por TunbridgeWells
fuente
1

ejecute esto para obtener el tamaño por tabla:

/******************************************************************************
**    File: “GetTableSpaceUsage.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 ;

tomado del blog de Robert Caine

Este código es para Microsoft SQL 2005+

balexandre
fuente
0

Ejecute Inicio \ Programas \ Microsoft SQL Server \ Enterprise Manager. Abra la hoja de base de datos, en la propiedad% databasename% puede ver los filtros de datos de ubicación y los archivos de transacciones.


fuente
O si es SQL Server 2005, 2008, etc., abra SQL Management Studio, haga clic con el botón derecho en la base de datos, seleccione propiedades y luego haga clic en el segundo elemento en la pestaña izquierda, archivos. Sin embargo, esto solo devolverá el tamaño general del archivo, que puede ver simplemente mirando en la carpeta donde se almacenan los datos y el archivo de registro.
David
0

Esta es una consulta / vista que obtiene toda esta información, y más, sin cursores o bucles "malvados". ;-)

    /*
    vwTableInfo - Table Information View

 This view display space and storage information for every table in a
SQL Server 2005 database.
Columns are:
    Schema
    Name
    Owner       may be different from Schema)
    Columns     count of the max number of columns ever used)
    HasClusIdx  1 if table has a clustered index, 0 otherwise
    RowCount
    IndexKB     space used by the table's indexes
    DataKB      space used by the table's data

 16-March-2008, [email protected]
 31-January-2009, Edited for better formatting
*/
--CREATE VIEW vwTableInfo
-- AS

    SELECT SCHEMA_NAME(tbl.schema_id) as [Schema]
    , tbl.Name
    , Coalesce((Select pr.name 
            From sys.database_principals pr 
            Where pr.principal_id = tbl.principal_id)
        , SCHEMA_NAME(tbl.schema_id)) as [Owner]
    , tbl.max_column_id_used as [Columns]
    , CAST(CASE idx.index_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [HasClusIdx]
    , Coalesce( (Select sum (spart.rows) from sys.partitions spart 
        Where spart.object_id = tbl.object_id and spart.index_id < 2), 0) AS [RowCount]

    , Coalesce( (Select Cast(v.low/1024.0 as float) 
        * SUM(a.used_pages - CASE WHEN a.type <> 1 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END) 
            FROM sys.indexes as i
             JOIN sys.partitions as p ON p.object_id = i.object_id and p.index_id = i.index_id
             JOIN sys.allocation_units as a ON a.container_id = p.partition_id
            Where i.object_id = tbl.object_id  )
        , 0.0) AS [IndexKB]

    , Coalesce( (Select Cast(v.low/1024.0 as float)
        * SUM(CASE WHEN a.type <> 1 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END) 
            FROM sys.indexes as i
             JOIN sys.partitions as p ON p.object_id = i.object_id and p.index_id = i.index_id
             JOIN sys.allocation_units as a ON a.container_id = p.partition_id
            Where i.object_id = tbl.object_id)
        , 0.0) AS [DataKB]
    , tbl.create_date, tbl.modify_date

     FROM sys.tables AS tbl
      INNER JOIN sys.indexes AS idx ON (idx.object_id = tbl.object_id and idx.index_id < 2)
      INNER JOIN master.dbo.spt_values v ON (v.number=1 and v.type='E')

Disfrutar.

RBarryYoung
fuente
-1

Hay varias descripciones de cómo hacerlo desde la GUI.

Los verdaderos DBA lo saben: las GUI son para tontos.

sp_helpdb

Devuelve un conjunto de registros de todos los nombres de archivo, ubicaciones, espacio en disco y tipo.

También puede recuperar los nombres de archivo de la tabla sysfiles de cada base de datos.


fuente