Verifica dimensione tabelle in SQL Server

Verificare dimensione tabelle in SQL Server 2019

Utilizzando SQL Server Management Studio (SSMS) è possibile visualizzare la dimensione di tutte le tabelle presenti all’interno di un database.

In questo post vedremo insieme come verificare dimensione tabelle in SQL Server tramite SSMS (SQL Server Management Studio) e stored procedure messe a disposizione da SQL Server

Verificare dimensione tabelle in SQL Server mediante Report

Conoscere la dimensione tabelle in SQL Server consente di prendere decisioni migliori, ad esempio quando si prevedono i requisiti di spazio su disco o si dà la priorità alla risoluzione delle inefficienze all’interno del database (ad esempio tipi di dati/compressione).

Ci sono molti modi per controllare le dimensioni di una tabella in SQL Server come l’utilizzo dei report di SQL Server.

Il report “Utilizzo del disco” da parte delle tabelle principali in SQL Server consente di ottenere rapidamente le dimensioni di tutte le tabelle all’interno di un database.

Utilizzando SQL Server Management Studio (SSMS) è sufficiente fare clic con il pulsante destro del mouse su un database, selezionare Report, Report standard e Utilizzo disco in base alle tabelle principali.

Dimensione tabelle in SQL Server Report - Disk usage top tables
Dimensione tabelle in SQL Server Report – Disk usage top tables

Il rapporto mostra che questo database ha 2 tabelle di dimensioni vicine a 700 MB, entrambe contenenti lo stesso numero di righe, ma ci sono alcune differenze negli indici.

Dimensione tabelle in SQL Server - Lista tabelle
Dimensione tabelle in SQL Server – Lista tabelle

Dimensioni tabelle in SQL Server mediante query

Alle volte ho bisogno di controllare le dimensioni e l’occupazione di ogni singola tabella di un database per valutare quanto impatta sullo spazio disco.

La stored procedure (sp_spaceused) permette di visualizzare le informazioni richiamandola per ogni singola tabella di cui, però, dobbiamo già conoscere il nome da passargli come parametro.

exec sp_spaceused('table_name')

Se però abbiamo la necessità di visualizzare la dimensioni tabelle in SQL Server di uno specifico database, e magari ordinare l’elenco in base alle dimensioni delle tabelle, dobbiamo utilizzare una query più complessa.


Questa è la query che ci permette di visualizzare le dimensioni tabelle in SQL Server:

-- Script verifica dimensione tabelle in SQL Server


--SET database context
	USE [DataBaseName]
	
	--Declare Variable
	DECLARE @sql VARCHAR(128)
	DECLARE @name VARCHAR(128)

	--Create temporary table #Tables
	CREATE TABLE #Tables(Name VARCHAR(128))
	
	--Insert all TABLE_NAME inside the temporary table #Tables
	SET @sql = 'INSERT #Tables SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'''
	EXEC(@sql)
	
	--Create temporary table @SpaceUsed 
	CREATE TABLE #SpaceUsed 
		(Name VARCHAR(128), Rows VARCHAR(11), Reserved VARCHAR(18), Data VARCHAR(18), IndexSize VARCHAR(18), Unused VARCHAR(18))
	
	--Inserts the value in the #SpaceUsed table
	SET @name = ''
	WHILE exists (SELECT * FROM #Tables WHERE Name > @name)
	BEGIN
		SELECT @name = min(Name) FROM #Tables WHERE Name > @name
		SET @sql = 'EXEC ..sp_executesql N''insert #SpaceUsed exec sp_spaceused [' + @name + ']'''
		EXEC(@sql)
	END
	
	--Select and convert all values
	SELECT 
		Name,
		CAST(Rows AS DECIMAL) as Rows,
		CAST(left(Reserved, LEN(Reserved) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 AS Reserved,
		CAST(left(Data, LEN(Data) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 AS Data,
		CAST(left(IndexSize, LEN(IndexSize) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 as IndexSize,
		CAST(left(Unused, LEN(Unused) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 as Unused
	FROM #SpaceUsed
	ORDER BY Data DESC, Reserved DESC
	
	--Delete temporary tables
	DROP TABLE #tables
	DROP TABLE #SpaceUsed


-- Fine script verifica dimensione tabelle in SQL Server

Il codice è abbastanza commentato in modo da capire i passaggi che vengono effettuati prima di arrivare ad avere l’elenco delle tabelle con le rispettive dimensioni.

Se sei interessato ad altri post inerenti a SQL Server e le sue funzionalità puoi dare uno sguardo qui:

Descrizione della query

Per comodità illustro i singoli passaggi per verificare le dimensioni tabelle in SQL Server che la query compie.

Prima cosa indichiamo il database su cui verrà eseguita la query

--SET database context
USE [DataBaseName]

Dichiariamo le variabili che verranno utilizzare

	
	--Declare Variable
	DECLARE @sql VARCHAR(128)
	DECLARE @name VARCHAR(128)

Creiamo la tabella temporanea #Tables e la popoliamo con tutti i nomi delle tabelle presenti nel database (recuperati dalla tabella INFORMATION_SCHEMA.TABLES)

--Create temporary table #Tables
	CREATE TABLE #Tables(Name VARCHAR(128))
	
	--Insert all TABLE_NAME inside the temporary table #Tables
	SET @sql = 'INSERT #Tables SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'''
	EXEC(@sql)

Creiamo la tabella temporanea #SpaceUsed e, ciclando la tabella temporanea #Tables, la popoliamo con i valori di ogni singola tabella recuperati tramite la stored procedure sp_spaceused

--Create temporary table @SpaceUsed 
	
CREATE TABLE #SpaceUsed 
		(Name VARCHAR(128), Rows VARCHAR(11), Reserved VARCHAR(18), Data VARCHAR(18), IndexSize VARCHAR(18), Unused VARCHAR(18))
	
	--Inserts the value in the #SpaceUsed table
	SET @name = ''
	WHILE exists (SELECT * FROM #Tables WHERE Name > @name)
	BEGIN
		SELECT @name = min(Name) FROM #Tables WHERE Name > @name
		SET @sql = 'EXEC ..sp_executesql N''insert #SpaceUsed exec sp_spaceused [' + @name + ']'''
		EXEC(@sql)
	END

Ora non ci resta che effettuare una SELECT sulla tabella temporanea #SpaceUsed in modo da visualizzare tutti i dati delle tabelle del database.
Per una migliore interpretazione dei dati convertiamo tutti i valori in GByte e li ordiniamo dalla più grande in modo decrescente

-Select and convert all values
	SELECT 
		Name,
		CAST(Rows AS DECIMAL) as Rows,
		CAST(left(Reserved, LEN(Reserved) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 AS Reserved,
		CAST(left(Data, LEN(Data) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 AS Data,
		CAST(left(IndexSize, LEN(IndexSize) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 as IndexSize,
		CAST(left(Unused, LEN(Unused) - 3) AS DECIMAL(18, 3)) / 1024 / 1024 as Unused
	FROM #SpaceUsed
	ORDER BY Data DESC, Reserved DESC

Al termine della select eliminiamo le tabelle temporanee

--Delete temporary tables
	DROP TABLE #tables
	DROP TABLE #SpaceUsed

Conclusione

Abbiamo visto come verificare dimensione tabelle in SQL Server mediante l’utilizzo di SQL Server Management Studio (SSMS) e della Stored Procedure.

Autore Bartolomeo

Consulente tecnico con la passione per il web e la tecnologia e tutto quello che le ronza intorno.
Nel tempo libero scrivo articoli per il mio blog su argomenti vari, in particolare su configurazione Windows, Linux e WordPress.

Condividi questo articolo!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Ho letto la policy privacy e accetto il trattamento dei miei dati personali in conformità al D.Lgs. 196/2003