TSQL Speicherverbrauch ermitteln

Manchmal will man wissen wie groß eine Tabelle in einer Datenbank (MSSQL) ist. Für eine Tabelle ist das relativ einfach:

EXEC sp_spaceused TABELLE

Aber wie macht man das für alle Tabellen, so dass man das auch noch nach Größe sortiert hin bekommt? Bei mir ist das ein zweistufiges Verfahren: Ich erzeuge mir über SQL ein paar Statements die ich dann in ein anderes kopiere …

Aber der Reihe nach: Das eigentliche Skript zur Bestimmung des Speicherbedarfs ist das Folgende:


DECLARE @SpaceTABLE TABLE
(
	name		SYSNAME,
	rows		BIGINT,
	reserved	VARCHAR(100),
	data		VARCHAR(100),
	index_size	VARCHAR(100),
	unused		VARCHAR(100)
)

INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_1
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_2
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_3
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_4
-- ...
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_n


DECLARE @ResultTABLE TABLE
(
	name		SYSNAME,
	rows		BIGINT,
	reserved	VARCHAR(100),
	data		VARCHAR(100),
	index_size	VARCHAR(100),
	unused		VARCHAR(100),
	order_size  BIGINT
)
INSERT INTO @ResultTABLE
SELECT *,
	   CAST (SUBSTRING (data,0, LEN(data)-2) AS BIGINT) +
       CAST (SUBSTRING (index_size,0, LEN(index_size)-2) AS BIGINT)
  FROM @SpaceTABLE

-- ----------------------------------------------------------------------------------------------------

SELECT 'SUM' AS name,
       CAST (SUM(CAST (SUBSTRING (reserved,0, LEN(reserved)-2) AS BIGINT)) AS VARCHAR(100)) + ' KB' AS reserved,
       CAST (SUM(CAST (SUBSTRING (data,0, LEN(data)-2) AS BIGINT)) AS VARCHAR(100)) + ' KB' AS data,
       CAST (SUM(CAST (SUBSTRING (index_size,0, LEN(index_size)-2) AS BIGINT)) AS VARCHAR(100)) + ' KB' as index_size,
       CAST (SUM(CAST (SUBSTRING (unused,0, LEN(unused)-2) AS BIGINT)) AS VARCHAR(100)) + ' KB' as unused,
       CAST (SUM(order_size)  AS VARCHAR(100)) + ' KB' as total_size
  FROM @ResultTABLE

-- ----------------------------------------------------------------------------------------------------

SELECT	name,
		rows,
		reserved,
		data,
		index_size,
		unused,
		CAST (order_size AS VARCHAR(100)) + ' KB' AS total_size
  FROM @ResultTABLE
 ORDER BY order_size DESC

Nachdem ich aber das Skript nicht unnötig mit Schleifen, der Verwendung von Cursors oder Ähnliches komplizierter machen möchte, setzte ich einfach für.

INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_1
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_2
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_3
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_4
-- ...
INSERT INTO @SpaceTABLE EXEC sp_spaceused TABELLE_n

Das Ergebis von folgendem Skript ein

SELECT 'INSERT INTO @SpaceTABLE EXEC  sp_spaceused '+ TABLE_NAME 
  FROM   INFORMATION_SCHEMA.TABLES 
 WHERE  TABLE_TYPE = 'BASE TABLE'

Und habe das gleiche Ergebnis …

Leave a Reply

Your email address will not be published. Required fields are marked *

*