Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

6 Möglichkeiten, die Größe einer Datenbank in SQL Server mit T-SQL zu überprüfen

Wenn Sie ein GUI-Tool wie SSMS verwenden, um Ihre Datenbanken zu verwalten, können Sie die Größe Ihrer Datenbank ganz einfach überprüfen, indem Sie sich durch die GUI klicken (klicken Sie mit der rechten Maustaste auf die Datenbank, zeigen Sie auf Berichte , dann Standardberichte und klicken Sie dann auf Festplattennutzung ).

Wenn Sie jedoch lieber T-SQL verwenden, um Ihre Datenbanken zu verwalten, müssen Sie eine Abfrage ausführen, die diese Informationen zurückgibt.

Dieser Artikel stellt sechs Möglichkeiten vor, die Größe einer SQL Server-Datenbank mit T-SQL zu überprüfen.

Die gespeicherte Prozedur sp_spaceused

Dies ist eine gespeicherte Systemprozedur, die die Anzahl der Zeilen, den reservierten Speicherplatz und den von einer Tabelle, indizierten Ansicht oder einer Service Broker-Warteschlange verwendeten Speicherplatz in der aktuellen Datenbank oder den von der gesamten Datenbank reservierten und verwendeten Speicherplatz anzeigt.

Wechseln Sie dazu einfach in die entsprechende Datenbank und führen Sie die Prozedur aus. So:

USE WideWorldImporters;
EXEC sp_spaceused;

Ergebnis:

database_name       database_size  unallocated space
------------------  -------------  -----------------
WideWorldImporters  3172.00 MB     2511.76 MB       

1 row(s) returned

reserved   data       index_size  unused 
---------  ---------  ----------  -------
573688 KB  461728 KB  104120 KB   7840 KB

1 row(s) returned

Dies gibt zwei Ergebnismengen zurück, die die relevanten Informationen liefern.

Sie können auch einen Objektnamen angeben, um Daten zu einem bestimmten Objekt in der Datenbank zurückzugeben. In diesem Fall wird nur eine Ergebnismenge zurückgegeben.

Beispiel:

USE WideWorldImporters;
EXEC sp_spaceused N'Application.Cities';

Ergebnis:

name    rows                  reserved  data     index_size  unused
------  --------------------  --------  -------  ----------  ------
Cities  37940                 4880 KB   3960 KB  896 KB      24 KB

In diesem Beispiel geben wir Informationen über die Cities zurück nur Tabelle.

Die gespeicherte Prozedur sp_helpdb

Eine weitere gespeicherte Systemprozedur ist sp_helpdb .

Hier ist ein Beispiel für den Aufruf:

EXEC sp_helpdb N'WideWorldImporters';

Ergebnis:

name          fileid  filename          filegroup  size        maxsize        growth    usage    
------------  ------  ----------------  ---------  ----------  -------------  --------  ---------
WWI_Primary   1       /data/WWI.mdf     PRIMARY    1048576 KB  Unlimited      65536 KB  data only
WWI_Log       2       /data/WWI.ldf     null       102400 KB   2147483648 KB  65536 KB  log only 
WWI_UserData  3       /data/WWI_UD.ndf  USERDATA   2097152 KB  Unlimited      65536 KB  data only

In diesem Fall übergeben wir den Namen der Datenbank als Argument. Wir können auch sp_helpdb aufrufen ohne ein Argument zu liefern. Wenn wir dies tun, werden Informationen zu allen Datenbanken in den sys.databases zurückgegeben Katalogansicht.

Die gespeicherte Prozedur sp_databases

Eine weitere Option sind die sp_databases System gespeicherte Prozedur. Diese gespeicherte Prozedur listet Datenbanken auf, die sich entweder in einer Instanz von SQL Server befinden oder auf die über ein Datenbank-Gateway zugegriffen werden kann.

So führen Sie es aus:

EXEC sp_databases;

Ergebnis:

DATABASE_NAME       DATABASE_SIZE  REMARKS
------------------  -------------  -------
master              6848           null   
model               16384          null   
msdb                15616          null   
Music               16384          null   
Nature              16384          null   
Solutions           47104          null   
tempdb              16384          null   
Test                16384          null   
WideWorldImporters  3248128        null   
world               16384          null   
WorldData           16384          null

Die sys.master_files-Ansicht

Die obige gespeicherte Prozedur fragt die sys.master_files ab Aussicht. Eine Alternative besteht also darin, direkt zur Ansicht zu gehen und Ihre Spalten auszuwählen:

SELECT
    name,
    size,
    size * 8/1024 'Size (MB)',
    max_size
FROM sys.master_files
WHERE DB_NAME(database_id) = 'WideWorldImporters';

Ergebnis:

name          size    Size (MB)  max_size 
------------  ------  ---------  ---------
WWI_Primary   131072  1024       -1       
WWI_Log       12800   100        268435456
WWI_UserData  262144  2048       -1       

In diesem Fall können wir die Größe jeder Datendatei und jeder Protokolldatei sehen, da sie separat aufgeführt sind. Sie werden auch feststellen, dass ich eine Berechnung der size durchführe Spalte, um den Wert in Megabyte (MB) umzuwandeln.

Die sys.database_files-Ansicht

Es gibt auch eine Systemansicht namens sys.database_files . Wir können diese Ansicht verwenden, um dieselben Informationen wie im vorherigen Beispiel zurückzugeben:

USE WideWorldImporters;
SELECT
    name,
    size,
    size * 8/1024 'Size (MB)',
    max_size
FROM sys.database_files;

Ergebnis:

name          size    Size (MB)  max_size 
------------  ------  ---------  ---------
WWI_Primary   131072  1024       -1       
WWI_Log       12800   100        268435456
WWI_UserData  262144  2048       -1       

Verwenden Sie eine Fensterfunktion

Ein mögliches Problem bei den beiden vorherigen Beispielen besteht darin, dass sie die Größe jeder Datei separat auflisten. Dies kann als positiv oder negativ angesehen werden, je nachdem, was Sie erreichen möchten.

Man könnte auch argumentieren, dass die ersten drei Lösungen auf dieser Seite problematisch sind, weil sie nur die Gesamtsumme aller Dateien liefern – sie listen nicht jede einzelne Datei mit ihrer Größe auf.

Was also, wenn Sie sowohl die Größe jeder einzelnen Datei sehen möchten, und die Summe aller Dateien für jede Datenbank?

Sie könnten den OVER verwenden Klausel, um genau das zu tun.

Hier ist ein Beispiel:

SELECT
    d.name AS 'Database',
    m.name AS 'File',
    m.size,
    m.size * 8/1024 'Size (MB)',
    SUM(m.size * 8/1024) OVER (PARTITION BY d.name) AS 'Database Total',
    m.max_size
FROM sys.master_files m
INNER JOIN sys.databases d ON
d.database_id = m.database_id;

Ergebnis:

Database            File             Size (MB)  Database Total
------------------  ---------------  ---------  --------------
master              master           4          6             
master              mastlog          2          6             
model               modeldev         8          16            
model               modellog         8          16            
msdb                MSDBData         14         14            
msdb                MSDBLog          0          14            
Music               Music            8          16            
Music               Music_log        8          16            
Nature              Nature           8          16            
Nature              Nature_log       8          16            
Solutions           Solutions        8          46            
Solutions           Solutions_log    8          46            
Solutions           Solutions_dat_2  10         46            
Solutions           Solutions_dat_3  10         46            
Solutions           Solutions_log_2  10         46            
tempdb              tempdev          8          16            
tempdb              templog          8          16            
WideWorldImporters  WWI_Primary      1024       3172          
WideWorldImporters  WWI_Log          100        3172          
WideWorldImporters  WWI_UserData     2048       3172          
world               world            8          16            
world               world_log        8          16       

Dies listet jede Datenbank, die Dateien für jede Datenbank, die Dateigröße für jede Datei sowie die Gesamtzahl aller Dateien für jede Datenbank auf. Dies erfordert, dass jede Datenbank (und ihre Gesamtgröße) mehrfach aufgeführt wird (einmal für jede Datei).