テーブルに対して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を示しています。どちらが正しいか?
率直に言って、私も使いません。最大のテーブルをすぐに見つけることができます-より柔軟性があります-そしてどこに@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
この投稿はあなたに別のアプローチを与えるかもしれません。 sys.database_filesはかなり信頼できることがわかりました。
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;