Hitta de största tabellerna

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Ibland vill man veta vilka tabeller som tar upp utrymmet i en vissa databas, till exempel om du upplever ökad tillväxt eller helt enkelt vill ta reda på om det finns stora tabeller som du borde städa ut historiskt data ur. Det är ju så att 1 GB data i din databas lätt kan kräva 10 GB lagringsutrymme totalt, om man räknar  in backup utrymme, redundans på disknivå, test och utvecklingsmiljöer och så vidare.
Ett enkelt sätt att titta på detta är att högerklicka på databasen och välja Reports -> Standard Reports -> Disk Usage By Top Tables Du får då en rapport som ser ut såhär:
 

 
Om du vill göra detta lite mer automatiserat, och inte högerklicka för mycket, kan du givetvis skriva ihop ett script för detta. Eller så kan du köra Profiler, och fånga frågan som rapporten ovan kör, och anpassa den lite. Då kan du få ut en kodsnutt som ser ut ungefär som den nedan, som du sedan kan anpassa för eget behov:
 
SELECT TOP 10    (row_number() over(order by (a1.reserved + ISNULL(a4.reserved,0)) desc))%2 as l1,   
 a3.name AS [schemaname],    a2.name AS [tablename],    a1.rows as row_count,    
(a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved,    a1.data * 8 AS data,   
 (CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data 
THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS index_size,   
(CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used 
THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used 
ELSE 0 END) * 8 AS unused    
FROM    
(SELECT    ps.object_id,    SUM (    CASE    WHEN (ps.index_id < 2) THEN row_count    ELSE 0    END    ) AS [rows],
 SUM (ps.reserved_page_count) AS reserved,    
SUM (    CASE    WHEN (ps.index_id < 2) 
THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)    
ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)    
END    ) AS data,    
SUM (ps.used_page_count) AS used    
FROM sys.dm_db_partition_stats ps    
GROUP BY ps.object_id) AS a1   
LEFT OUTER JOIN   
 (SELECT    it.parent_id,    SUM(ps.reserved_page_count) AS reserved,    SUM(ps.used_page_count) AS used   
 FROM sys.dm_db_partition_stats ps    
INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)    
WHERE it.internal_type IN (202,204)    
GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)    
INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id )    
INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)    
WHERE a2.type <> N'S' and a2.type <> N'IT'
 
Till exempel kan informationen sparas till en tabell för att kunna gå bakåt och titta på historisk information, för att kunna se trender.