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 …