2008-10-06 21 views
72

SQL Server 2005/2008 La edición Express tiene una limitación de 4 GB por base de datos. Por lo que sé, el motor de base de datos considera solo los datos, excluyendo así los archivos de registro, el espacio no utilizado y el tamaño del índice.Determinar el tamaño de la base de datos de SQL Server

Obtener la longitud del archivo MDF no debe dar el tamaño correcto de la base de datos en términos de limitación de SQL Server. Mi pregunta es cómo obtener el tamaño de la base de datos?

Respuesta

91

sp_spaceused

+5

sp_spaceused tiene en cuenta el tamaño del archivo de registro, por lo que si usted tiene una muy pequeña dB y un archivo de registro muy grande, la resultado t de sp_spaceused será engañoso cuando intente determinar qué tan cerca está del límite de 4 GB. – Lamar

+0

La pregunta explícitamente solicita que se incluya el archivo de registro. ¿Está equivocado sobre el archivo de registro que se aplica al límite de 4 GB? –

+1

+1 por brevedad. Me encantan las respuestas cortas! – ren

14

En SQL Server Management Studio, haga clic en una base de datos y seleccionar "Propiedades" en el menú contextual. Mire la figura de "Tamaño".

16

Según la ayuda de SQL2000, sp_spaceused incluye datos e índices.

Este script debe hacer:

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), 
data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18)) 

EXEC sp_msforeachtable 'INSERT INTO #t EXEC sp_spaceused ''?''' 
-- SELECT * FROM #t ORDER BY name 
-- SELECT name, CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)) FROM #t ORDER BY name 
SELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3))) FROM #t 
DROP TABLE #t 
+0

Esta es una GRAN respuesta. Gracias por el guión, ¡muy útil! –

74

sp_helpdb

sin loop es necesario, a diferencia de sp_spaceused.

+0

¡Genial! Realmente ayuda. –

+4

Proporciona el tamaño de BD asignado (tamaño del archivo mdf), no el tamaño real utilizado. – Mrchief

6

La mejor solución es tal vez para calcular el tamaño de cada archivo de base de datos, utilizando la vista sys.sysfiles, considerando un tamaño de 8 KB para cada página, de la siguiente manera:

USE [myDatabase] 
GO 

SELECT 
    [size] * 8 
    , [filename] 
FROM sysfiles 

La columna [campo] representa el tamaño del archivo, en páginas (MSDN Reference to sysfiles).

Verías habrá al menos dos archivos (MDF y LDF): La suma de estos archivos le dará el tamaño correcto de la base de datos ...

+5

+1 'SELECT SUM (size) /128.0 AS size FROM sysfiles' devuelve el mismo valor que' sp_spaceused', pero podría ser más fácil de analizar automáticamente. –

+0

Sí, mucho más fácil! – MAXE

2

Usted podría utilizar esta antigua usanza como así ...

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

DECLARE @iCount int, @iMax int, @DatabaseName varchar(200), @SQL varchar (8000) 

Select NAME, DBID, crdate, filename, version 
INTO #TEMP 
from MAster..SYSDatabASES 

SELECT @iCount = Count(DBID) FROM #TEMP 

Select @SQL='Create Table ##iFile1 (DBName varchar(200) NULL, Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT , 
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null) '+ char(10) 
exec (@SQL) 


Create Table ##iTotals (ServerName varchar(100), DBName varchar(200) NULL, FileType varchar(10),Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT , 
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null) 


WHILE @iCount>0 
BEGIN  
    SELECT @iMax =Max(dbid) FROM #TEMP 
    Select @DatabaseName = Name FROM #TEMP where dbid [email protected] 

    SELECT @SQL = 'INSERT INTO ##iFile1(Fileid , FileGroup , TotalExtents , USedExtents , Name , vFile) 
    EXEC (''USE [' + @DatabaseName + '] DBCC showfilestats'') ' + char(10) 

    Print (@SQL) 
    EXEC (@SQL) 


    SELECT @SQL = 'UPDATE ##iFile1 SET DBName ='''+ @DatabaseName +''' WHERE DBName IS NULL' 
    EXEC (@SQL) 


    DELETE FROM #TEMP WHERE dbid [email protected] 
    Select @iCount [email protected] -1 
END 
UPDATE ##iFile1 
SET AllocatedSpace = (TotalExtents * 64.0/1024.0), UsedSpace =(USedExtents * 64.0/1024.0) 

UPDATE ##iFile1 
SET PercentageFree = 100-Convert(float,UsedSpace)/Convert(float,AllocatedSpace )* 100 
WHERE USEDSPACE>0 

CREATE TABLE #logspace (
    DBName varchar(100), 
    LogSize float, 
    PrcntUsed float, 
    status int 
    ) 
INSERT INTO #logspace 
EXEC ('DBCC sqlperf(logspace)') 



INSERT INTO ##iTotals(ServerName, DBName, FileType,Name, vFile,PercentageFree,AllocatedSpace) 
select @@ServerName ,DBNAME, 'Data' as FileType,Name, vFile, PercentageFree , AllocatedSpace 
from ##iFile1 
UNION 
select @@ServerName ,DBNAME, 'Log' as FileType ,DBName,'' as vFile ,PrcntUsed , LogSize 
from #logspace 

Select * from ##iTotals 

select ServerName ,DBNAME, FileType, Sum(AllocatedSpace) as AllocatedSpaceMB 
from ##iTotals 
Group By ServerName ,DBNAME, FileType 
Order By ServerName ,DBNAME, FileType 


select ServerName ,DBNAME, Sum(AllocatedSpace) as AllocatedSpaceMB 
from ##iTotals 
Group By ServerName ,DBNAME 
Order By ServerName ,DBNAME 



drop table ##iFile1 
drop table #logspace 
drop table #TEMP 
drop table ##iTotals 
4

siempre me ha gustado ir tras él directamente:

SELECT 
    DB_NAME(dbid) AS DatabaseName, 
    CAST((SUM(size) * 8)/(1024.0 * 1024.0) AS decimal(10, 2)) AS DbSizeGb 
FROM 
    sys.sysaltfiles 
GROUP BY 
    DB_NAME(dbid) 
+2

Tenga en cuenta que en SQL 2005 +, sysaltfiles no pueden leerse con una cuenta de usuario básica (es decir, una sin permisos especiales). Incluso si agrega el inicio de sesión a la base de datos maestra y GRANT SELECT en master..sysaltfiles o sys.sysaltfiles, una instrucción select en esta tabla devolverá un conjunto de registros vacío. No hay problema usando una cuenta sysadmin aunque '. – Mike

Cuestiones relacionadas