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?

Antworten:


102

sp_spaceused


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.


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

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.


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 ...


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 )

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

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 ;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.