利用非公開預存程序 sp_MSforeachtable 遍歷所有使用者資料表,呼叫 sp_spaceused 收集空間使用統計,彙總至暫存表供查詢排序。
CREATE TABLE #temp (
TableName NVARCHAR(128),
RowsCnt VARCHAR(11),
ReservedSpace VARCHAR(18),
DataSpace VARCHAR(18),
CombinedIndexSpace VARCHAR(18),
UnusedSpace VARCHAR(18)
);
EXEC sp_MSforeachtable
'INSERT INTO #temp (TableName, RowsCnt, ReservedSpace, DataSpace, CombinedIndexSpace, UnusedSpace)
EXEC sp_spaceused ''?'', FALSE';
SELECT TableName, RowsCnt, ReservedSpace, DataSpace, CombinedIndexSpace, UnusedSpace
FROM #temp
ORDER BY TableName;
DROP TABLE #temp;
ReservedSpace:資料表保留總空間(含索引、未使用)DataSpace:資料列實際佔用空間CombinedIndexSpace:所有索引佔用空間UnusedSpace:已保留但未使用空間sp_MSforeachtable 為非文件化、非支援程序,未來版本可能移除。sys.dm_db_partition_stats 配合 sys.tables 自行撰寫查詢,受官方支援且可精確控制單位(KB/MB/GB)。SELECT
t.name AS TableName,
SUM(p.row_count) AS RowCount,
SUM(p.reserved_page_count) * 8.0 / 1024 AS ReservedSpaceMB,
SUM(p.used_page_count) * 8.0 / 1024 AS UsedSpaceMB,
SUM(CASE WHEN i.index_id IN (0,1) THEN p.in_row_data_page_count + p.lob_used_page_count + p.row_overflow_used_page_count ELSE 0 END) * 8.0 / 1024 AS DataSpaceMB,
SUM(CASE WHEN i.index_id > 1 THEN p.used_page_count ELSE 0 END) * 8.0 / 1024 AS IndexSpaceMB
FROM sys.tables t
JOIN sys.dm_db_partition_stats p ON t.object_id = p.object_id
JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id
GROUP BY t.name
ORDER BY ReservedSpaceMB DESC;