Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

6 modi per controllare le dimensioni di un database in SQL Server utilizzando T-SQL

Se utilizzi uno strumento GUI, come SSMS per gestire i tuoi database, puoi controllare facilmente le dimensioni del tuo database facendo clic sulla GUI (fai clic con il pulsante destro del mouse sul database, seleziona Rapporti , quindi Rapporti standard quindi fai clic su Utilizzo disco ).

Tuttavia, se preferisci utilizzare T-SQL per gestire i tuoi database, dovrai eseguire una query che restituisca queste informazioni.

Questo articolo presenta sei modi per controllare le dimensioni di un database di SQL Server utilizzando T-SQL.

La stored procedure sp_spaceused

Si tratta di una stored procedure di sistema che visualizza il numero di righe, lo spazio su disco riservato e lo spazio su disco utilizzato da una tabella, una vista indicizzata o una coda di Service Broker nel database corrente oppure visualizza lo spazio su disco riservato e utilizzato dall'intero database.

Per utilizzarlo è sufficiente passare al relativo database ed eseguire la procedura. In questo modo:

USE WideWorldImporters;
EXEC sp_spaceused;

Risultato:

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

Questo restituisce due set di risultati che forniscono le informazioni rilevanti.

È inoltre possibile fornire un nome oggetto per restituire i dati su un oggetto specifico all'interno del database. In questo caso, verrà restituito un solo set di risultati.

Esempio:

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

Risultato:

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

In questo esempio restituiamo informazioni sulle Cities solo tabella.

La procedura memorizzata sp_helpdb

Un'altra procedura memorizzata di sistema è sp_helpdb .

Ecco un esempio di come chiamarlo:

EXEC sp_helpdb N'WideWorldImporters';

Risultato:

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 questo caso, passiamo come argomento il nome del database. Possiamo anche chiamare sp_helpdb senza fornire un argomento. In tal caso, verranno restituite informazioni su tutti i database in sys.databases vista catalogo.

La procedura archiviata di sp_databases

Ancora un'altra opzione è sp_databases procedura memorizzata di sistema. Questa procedura memorizzata elenca i database che risiedono in un'istanza di SQL Server o sono accessibili tramite un gateway di database.

Ecco come eseguirlo:

EXEC sp_databases;

Risultato:

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

La vista sys.master_files

La procedura memorizzata sopra interroga i sys.master_files Visualizza. Quindi un'alternativa è andare direttamente alla visualizzazione e selezionare le colonne:

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

Risultato:

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

In questo caso possiamo vedere la dimensione di ciascun file di dati e file di registro, poiché sono elencati separatamente. Noterai anche che eseguo un calcolo sulla size colonna per convertire il valore in megabyte (MB).

La vista sys.database_files

C'è anche una vista di sistema chiamata sys.database_files . Possiamo usare questa vista per restituire le stesse informazioni dell'esempio precedente:

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

Risultato:

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

Utilizzare una funzione finestra

Un potenziale problema con i due esempi precedenti è che elencano separatamente le dimensioni di ciascun file. Questo potrebbe essere visto come positivo o negativo a seconda di ciò che vuoi ottenere.

Si potrebbe anche sostenere che le prime tre soluzioni in questa pagina sono problematiche, perché forniscono solo la somma totale di tutti i file, non elencano ogni singolo file insieme alle sue dimensioni.

E se volessi vedere sia le dimensioni di ogni singolo file, e il totale di tutti i file per ogni database?

Potresti usare il OVER clausola per fare esattamente questo.

Ecco un esempio:

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;

Risultato:

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       

Questo elenca ogni database, i file per ogni database, la dimensione del file per ogni file, nonché il totale di tutti i file per ogni database. Ciò richiede che ogni database (e la relativa dimensione totale) sia elencato più volte (una volta per ogni file).