Tabellengröße per Script auslesen

Neulich hatte ich mit einer schnell wachsenden Datenbank zu kämpfen. Diese wuchs pro Tag um mehrere hundert MB, was nach einigen Wochen zu einem beachtlichen Volumen führte. Da die Datenbank über zahlreiche Tabellen verfügte, war es sehr mühsam herauszufinden, welche Tabelle so stark wächst. Mit diesem Script kann man alle Tabellen und deren Dateigröße einer Datenbank auflisten.

-- Datenbank auswählen
use MyDatabase 
--Ausgabe von gelesenen Zeilen ausschalten
set nocount on
 -- Deklaration der benötigten Variablen
declare @table varchar(255)
 
-- Erstellen der temporären Tabelle
create table #rowcount
(name nvarchar(128),
rows char(11),
reserved varchar(18),
data varchar(18),
index_size varchar(18),
unused varchar(18))
 
-- Deklaration des Cursors zum Auslesen der Tabellen der Datenbank
declare tables_cursor cursor for
   select table_name from information_schema.tables
   where table_type ='base table'
 
-- Öffnen des Cursors und auslesen der ersten Tabelle  
open tables_cursor
fetch next from tables_cursor into @table
 
-- Wiederholen, solange der Fetch erfolgreich war
while @@FETCH_STATUS = 0
begin
     -- Auslesen der Größe mittels stored procedure und einfügen
     -- in temporäre Tabelle
     insert into #rowcount
        exec sp_spaceused @table
       
     -- nächste Tabelle auslesen
     fetch next from tables_cursor into @table
end
 
-- Cursor schließen und Speicher freigeben
close tables_cursor
deallocate tables_cursor
 
-- Selektieren und konvertieren der Ergebnistabelle
select * from (
select name,
CAST(rows as int) as rowcnt,
cast(SUBSTRING(reserved, 1, CHARINDEX(' ', reserved)) as int) as reserved,
cast(SUBSTRING(data, 1, CHARINDEX(' ', data)) as int) as data,
cast(SUBSTRING(index_size, 1, CHARINDEX(' ', index_size)) as int) as index_size,
cast(SUBSTRING(unused, 1, CHARINDEX(' ', unused)) as int) as unused
 from #rowcount
 ) as a order by data desc
 
 -- temporäre Tabelle entfernen
drop table #rowcount