web-dev-qa-db-ja.com

sp_spaceusedと標準レポート「上位テーブルによるディスク使用量」のテーブルサイズが異なる

テーブルに対してsp_spaceusedとDiskUsage by TopTablesの標準レポートを実行しました。

Sp_spaceusedの結果は次のとおりです。

name rows reserved data index_size used
SomeTable <1301755> <7691344 KB> <3931672 KB> <3673840 KB> <85832 KB>

ただし、上位テーブル別のディスク使用量レポートには次のように表示されます。

Table Name  # Records   Reserved (KB)       Data (KB)   Indexes (KB)    Unused (KB)     
SomeTable   1.301.755   4.340.216       3.931.672   324.776 83.768      

レコード数は同じですが、使用されるスペースの点で2つの間に大きなギャップがあります。 sp_spaceusedは、予約済みとして7.691.344 KBを示していますが、レポートは4.340.216KBを示しています。どちらが正しいか?

1

率直に言って、私も使いません。最大のテーブルをすぐに見つけることができます-より柔軟性があります-そしてどこに@updateusage 設定されています。

CREATE PROCEDURE dbo.TopTables
  @NumberOfObjects INT = 100,
  @MinimumSizeInMB INT = 10
AS
BEGIN
  SET NOCOUNT ON;

  SELECT TOP (@NumberOfObjects)
    [object] = QUOTENAME(s.name) + N'.' + QUOTENAME(t.name),
    index_count = COUNT(i.index_id),
    size_in_MB = SUM(p.reserved_page_count)*8/1024.0
  FROM sys.schemas AS s
  INNER JOIN sys.objects AS t
  ON s.[schema_id] = t.[schema_id]
  INNER JOIN sys.indexes AS i
  ON t.[object_id] = i.[object_id]
  INNER JOIN sys.dm_db_partition_stats AS p
  ON t.[object_id] = p.[object_id]
  AND i.index_id = p.index_id
  WHERE t.is_ms_shipped = 0
  GROUP BY s.name, t.name
  HAVING SUM(p.reserved_page_count)*8/1024.0 >= @MinimumSizeInMB
  ORDER BY size_in_MB DESC;
END
GO
2
Aaron Bertrand

この投稿はあなたに別のアプローチを与えるかもしれません。 sys.database_filesはかなり信頼できることがわかりました。

https://stackoverflow.com/questions/9630279/listing-information-about-all-database-files-in-sql-server

Select 
    DB_NAME() AS [DatabaseName], 
    Name, 
    physical_name, 
    Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2) 
        as decimal(18,2)) as nvarchar) Size, 
    Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2) as decimal(18,2))
       - Cast(FILEPROPERTY(name, 'SpaceUsed') * 8.0/1024.0 
       as decimal(18,2)) as nvarchar) As FreeSpace 
From sys.database_files;
0
Peter