2009-12-24 14 views
39

En mssql2005 lorsque je veux obtenir la taille de la table en Mo, j'utilise EXEC sp_spaceused 'table'.Taille de la table SQL Azure

Est-il possible d'obtenir de l'espace utilisé par une table particulière dans SQL Azure en utilisant une requête ou une API?

Répondre

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 

Le premier vous donnera la taille de votre base de données en Mo et la seconde fera la même chose, mais le casser pour chaque objet dans votre base de données ordonnée par le plus grand au plus petit.

+0

Cela donne une taille significativement plus petite que sp_spaceUsed sur SQL Server (par ex. seulement 40% ou plus). Y a-t-il une raison à cela? Si vous utilisez une connexion ODBC, comment pouvez-vous dire que c'est Azure à l'arrière? –

+1

Troy - Cela a fonctionné très bien! Je vous remercie! – Rogala

5

De cette façon, vous pouvez avoir le plus grand sur le dessus:

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) est trompeur car il comptera 1 ligne pour chaque ligne d'un index. – tster

6

Voici une requête qui vous donnera par la table la taille totale, nombre de lignes et octets par ligne:

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 

Et voici une requête qui est la même chose que ci-dessus, mais il se décompose par index:

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