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 …