2009-12-24 7 views
39

En mssql2005 cuando deseo obtener el tamaño de la tabla en MB, utilizo EXEC sp_spaceused 'table'.Tamaño de la tabla SQL Azure

¿Hay alguna forma de obtener espacio utilizado por una tabla determinada en SQL Azure usando alguna consulta o API?

Respuesta

103

de 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 

El primero de ellos le dará el tamaño de su base de datos en MB y el segundo hará lo mismo, pero romperlo a cabo para cada objeto en su base de datos ordenada por mayor a menor

+0

Esto da un tamaño significativamente más pequeño que sp_spaceUsed en SQL Server (p. Ej. solo 40% más o menos). ¿Hay alguna razón para esto? Si está utilizando una conexión ODBC, ¿cómo puede saber que es Azure en la parte de atrás? –

+1

Troy - Esto funcionó muy bien !! ¡Gracias! – Rogala

5

De esta manera usted puede tener la más grande en la parte superior:

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) es engañoso ya que contará 1 fila por cada fila en un índice. – tster

6

Aquí es una consulta que le dará junto a la mesa del tamaño total, el número de filas y bytes por fila:

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 

Y aquí es una consulta que es el mismo que el anterior pero se descompone por el índice:

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