首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 查詢資料表空間使用量:sp_MSforeachtable 批次收集腳本

     編輯:關於SqlServer

利用非公開預存程序 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;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved