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