2008-10-06 5 views
72

SQL Server 2005/2008 Express Edition a la limite de 4 Go par base de données. Autant que je sache, le moteur de base de données considère uniquement les données, excluant ainsi les fichiers journaux, l'espace inutilisé et la taille de l'index.Déterminez la taille de la base de données SQL Server

Obtenir la longueur du fichier MDF ne doit pas donner la taille de base de données correcte en termes de limitation SQL Server. Ma question est comment obtenir la taille de la base de données?

Répondre

91

sp_spaceused

+5

sp_spaceused prend en compte la taille du fichier journal, donc si vous avez un db vraiment petit et un fichier journal vraiment grand, la resul t de sp_spaceused sera trompeur en essayant de déterminer à quel point vous êtes proche de la limite de 4 Go. – Lamar

+0

La question demande explicitement l'inclusion du fichier journal. Est-il égaré à propos du fichier journal s'appliquant vers la limite de 4 Go? –

+1

+1 pour la shortness. J'aime les réponses courtes! – ren

14

Dans SQL Management Studio, cliquez-droit sur une base de données et sélectionnez "Propriétés" dans le menu contextuel. Regardez le chiffre "Taille".

16

Selon l'aide SQL2000, sp_spaceused inclut des données et des index.

Ce script devrait faire:

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

Ceci est une excellente réponse. Merci pour le script - très utile! –

74

sp_helpdb

pas looping nécessaire, à la différence sp_spaceused.

+0

Super !! Vraiment aide. –

+4

Donne la taille de la base de données allouée (taille du fichier mdf), pas la taille réellement utilisée. – Mrchief

6

La meilleure solution est peut-être calculer la taille de chaque fichier de base de données, en utilisant la vue sys.sysfiles, compte tenu d'une taille de 8 Ko pour chaque page, comme suit:

USE [myDatabase] 
GO 

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

La colonne [champ] représente la taille du fichier, en pages (MSDN Reference to sysfiles).

Vous verriez il y aura au moins deux fichiers (MDF et LDF): la somme de ces fichiers vous donnera la bonne taille de la base de données entière ...

+5

+1 'SELECT SUM (size)/128.0 AS size FROM sysfiles' renvoie la même valeur que' sp_spaceused', mais pourrait être plus facile à analyser automatiquement. –

+0

Oui, beaucoup plus facile! – MAXE

2

Vous pouvez utiliser cette ancienne façonné comme bien ...

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

J'ai toujours aimé aller après directement:

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

Sachez que dans SQL 2005 +, sysaltfiles ne peut pas être lu par un compte d'utilisateur de base (c'est-à-dire sans autorisations spéciales). Même si vous ajoutez la connexion à la base de données master et GRANT SELECT sur master..sysaltfiles ou sys.sysaltfiles, une instruction select de cette table renverra un jeu d'enregistrements vide. Aucun problème à utiliser un compte sysadmin tho '. – Mike

Questions connexes