2009-12-24 13 views
39

In mssql2005, wenn ich Größe der Tabelle in MBs abrufen möchte, verwende ich EXEC sp_spaceused "Tabelle".SQL Azure-Tabellengröße

Gibt es eine Möglichkeit, Speicherplatz von bestimmter Tabelle in SQL Azure mithilfe einiger Abfrage oder API zu erhalten?

Antwort

103

Von Ryan Dunn http://dunnry.com/blog/CalculatingTheSizeOfYourSQLAzureDatabase.aspx

select  
     sum(reserved_page_count) * 8.0/1024 [SizeInMB] 
from  
     sys.dm_db_partition_stats 

GO 

select  
     sys.objects.name, sum(reserved_page_count) * 8.0/1024 [SizeInMB] 
from  
     sys.dm_db_partition_stats, sys.objects 
where  
     sys.dm_db_partition_stats.object_id = sys.objects.object_id 

group by sys.objects.name 
order by sum(reserved_page_count) DESC 

Die erste wird Sie die Größe Ihrer Datenbank in MB geben und die zweite wird das gleiche tun, aber es brechen, indem sie bestellt in der Datenbank für jedes Objekt aus am größten zum kleinsten.

+0

Dies ergibt eine deutlich geringere Größe als sp_spaceUsed auf SQL Server (z. nur 40% oder so). Gibt es einen Grund dafür? Wenn Sie eine ODBC-Verbindung verwenden, wie können Sie feststellen, dass es Azure am Back-End ist? –

+1

Troy - Das hat super funktioniert !! Vielen Dank! – Rogala

5

Auf diese Weise können Sie die größere oben haben:

SELECT sys.objects.name, 
      SUM(row_count) AS 'Row Count', 
      SUM(reserved_page_count) * 8.0/1024 AS 'Table Size (MB)' 
    FROM sys.dm_db_partition_stats, sys.objects 
    WHERE sys.dm_db_partition_stats.object_id = sys.objects.object_id 
    GROUP BY sys.objects.name 
    ORDER BY [Table Size (MB)] DESC 

Source

+1

sum (row_count) ist trügerisch, da es für jede Zeile in einem Index eine Zeile zählt. – tster

6

Hier ist eine Abfrage, die Sie die Gesamtgröße von Tabelle gibt, die Anzahl der Zeilen und Bytes pro Zeile:

select 
    o.name, 
    max(s.row_count) AS 'Rows', 
    sum(s.reserved_page_count) * 8.0/(1024 * 1024) as 'GB', 
    (8 * 1024 * sum(s.reserved_page_count))/(max(s.row_count)) as 'Bytes/Row' 
from sys.dm_db_partition_stats s, sys.objects o 
where o.object_id = s.object_id 
group by o.name 
having max(s.row_count) > 0 
order by GB desc 

Und hier ist eine Abfrage, die die gleiche wie oben ist, aber es bricht durch den Index nach unten:

select 
    o.Name, 
    i.Name, 
    max(s.row_count) AS 'Rows', 
    sum(s.reserved_page_count) * 8.0/(1024 * 1024) as 'GB', 
    (8 * 1024* sum(s.reserved_page_count))/max(s.row_count) as 'Bytes/Row' 
from 
    sys.dm_db_partition_stats s, 
    sys.indexes i, 
    sys.objects o 
where 
    s.object_id = i.object_id 
    and s.index_id = i.index_id 
    and s.index_id >0 
    and i.object_id = o.object_id 
group by i.Name, o.Name 
having SUM(s.row_count) > 0 
order by GB desc