Bestimmen Sie die Größe der SQL Server-Datenbank

77

Für die SQL Server 2005/2008 Express Edition sind maximal 4 GB pro Datenbank zulässig. Soweit mir bekannt ist, berücksichtigt das Datenbankmodul nur Daten und schließt daher Protokolldateien, nicht verwendeten Speicherplatz und Indexgröße aus.

Das Abrufen der Länge der MDF-Datei sollte im Hinblick auf die SQL Server-Einschränkung nicht die richtige Datenbankgröße ergeben. Meine Frage ist, wie man die Datenbankgröße erhält?

Michael Damatov
quelle

Antworten:

102

sp_spaceused

Amy B.
quelle
7
sp_spaceused berücksichtigt die Größe der Protokolldatei. Wenn Sie also eine sehr kleine Datenbank und eine sehr große Protokolldatei haben, ist das Ergebnis von sp_spaceused irreführend, wenn Sie feststellen möchten, wie nahe Sie an der 4-GB-Grenze sind.
Lamar
77

sp_helpdb

Im Gegensatz zu sp_spaceused ist keine Schleife erforderlich.


quelle
5
Gibt die zugewiesene DB-Größe (Größe der MDF-Datei) aus, nicht die tatsächlich verwendete Größe.
Mrchief
16

Laut SQL2000-Hilfe enthält sp_spaceused Daten und Indizes.

Dieses Skript sollte Folgendes tun:

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
devio
quelle
Dies ist eine großartige Antwort. Danke für das Skript - sehr hilfreich!
Kevin Babcock
14

Klicken Sie in SQL Management Studio mit der rechten Maustaste auf eine Datenbank und wählen Sie "Eigenschaften" aus dem Kontextmenü. Schauen Sie sich die Abbildung "Größe" an.

Ian Nelson
quelle
8

Die beste Lösung besteht möglicherweise darin, die Größe jeder Datenbankdatei mithilfe der Ansicht sys.sysfiles unter Berücksichtigung einer Größe von 8 KB für jede Seite wie folgt zu berechnen:

USE [myDatabase]
GO

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

Die Spalte [Feld] gibt die Größe der Datei in Seiten an ( MSDN-Verweis auf Sysfiles ).

Sie würden sehen, dass es mindestens zwei Dateien (MDF und LDF) geben wird: Die Summe dieser Dateien gibt Ihnen die richtige Größe der gesamten Datenbank ...

MAXE
quelle
6
+1 SELECT SUM(size)/128.0 AS size FROM sysfilesgibt den gleichen Wert wie zurück sp_spaceused, ist jedoch möglicherweise einfacher automatisch zu analysieren.
Eugene Ryabtsev
5

Ich habe es immer gemocht, direkt danach zu streben:

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 )
Fuchsfeuer
quelle
2
Beachten Sie, dass in SQL 2005 + Sysaltfiles nicht von einem einfachen Benutzerkonto gelesen werden können (dh von einem Konto ohne besondere Berechtigungen). Selbst wenn Sie die Anmeldung zur Master-Datenbank hinzufügen und GRANT SELECT für master..sysaltfiles oder sys.sysaltfiles verwenden, gibt eine select-Anweisung in dieser Tabelle ein leeres Recordset zurück. Kein Problem mit einem Sysadmin-Konto.
Mike
2

Sie könnten auch dieses altmodische verwenden ...

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 =@iMax

    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 =@iMax
    Select @iCount =@iCount -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
Heinrich
quelle
0

Allgemeine Abfrage zum Überprüfen der Datenbankgröße in SQL Server, die sowohl Azure als auch On-Premises unterstützt.

Methode 1 - Verwenden der Systemansicht 'sys.database_files'

SELECT
    DB_NAME() AS [database_name],
    CONCAT(CAST(SUM(
        CAST( (size * 8.0/1024) AS DECIMAL(15,2) )
    ) AS VARCHAR(20)),' MB') AS [database_size]
FROM sys.database_files;

Methode 2 - Verwenden der gespeicherten Systemprozedur 'sp_spaceused'

EXEC sp_spaceused ;
Arulmouzhi
quelle