SELECT @@SERVERNAME AS ServerName,
DB_NAME() AS DBName,
object_id AS ObjectID,
SCHEMA_NAME(schema_id) AS SchName,
name AS TableName,
Rowcnt AS Rows,
Columns,
Indexes,
RowLength,
ReservedKb,
TableUsedKb,
UsedKb - TableUsedKb AS IndexUsedKb,
ReservedKb - UsedKb AS UnusedKb,
create_date AS CreateDate,
modify_date AS LastModifiedDate,
GETUTCDATE() AS TrackingUTCTime
FROM (
SELECT
t.object_id,
t.schema_id,
t.name,
(SELECT MAX(row_count) FROM sys.dm_db_partition_stats p WITH (NOLOCK)
WHERE p.object_id = t.object_id AND p.index_id < 2) AS Rowcnt,
(SELECT COUNT(1) FROM sys.syscolumns WITH (NOLOCK) WHERE id = t.object_id) AS Columns,
(SELECT COUNT(DISTINCT index_id) FROM sys.dm_db_partition_stats p WITH (NOLOCK)
WHERE p.object_id = t.object_id) AS Indexes,
(SELECT SUM(length) FROM sys.syscolumns WITH (NOLOCK) WHERE id = t.object_id) AS RowLength,
ISNULL((SELECT SUM(reserved_page_count) FROM sys.dm_db_partition_stats p WITH (NOLOCK)
WHERE p.object_id = t.object_id), 0) * 8
+ ISNULL((SELECT SUM(reserved_page_count)
FROM sys.dm_db_partition_stats p2 WITH (NOLOCK)
INNER JOIN sys.internal_tables it WITH (NOLOCK) ON p2.object_id = it.object_id
WHERE it.parent_id = t.object_id
AND it.internal_type IN (202,204,207,211,212,213,214,215,216,221,222,236)), 0) * 8 AS ReservedKb,
ISNULL((SELECT SUM(in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
FROM sys.dm_db_partition_stats p WITH (NOLOCK)
WHERE p.object_id = t.object_id AND p.index_id < 2), 0) * 8 AS TableUsedKb,
ISNULL((SELECT SUM(used_page_count) FROM sys.dm_db_partition_stats p WITH (NOLOCK)
WHERE p.object_id = t.object_id), 0) * 8
+ ISNULL((SELECT SUM(used_page_count)
FROM sys.dm_db_partition_stats p2 WITH (NOLOCK)
INNER JOIN sys.internal_tables it WITH (NOLOCK) ON p2.object_id = it.object_id
WHERE it.parent_id = t.object_id
AND it.internal_type IN (202,204,207,211,212,213,214,215,216,221,222,236)), 0) * 8 AS UsedKb,
t.create_date,
t.modify_date
FROM sys.tables t WITH (NOLOCK)
WHERE t.type = 'U'
) A
ORDER BY ReservedKb DESC;
| 欄位 | 說明 |
|---|---|
| ReservedKb | 表保留總空間 (含索引、內部表、未使用頁) |
| TableUsedKb | 資料列實際使用空間 (Heap/Clustered Index) |
| IndexUsedKb | 索引使用空間 |
| UnusedKb | 保留但未使用空間 |
| RowLength | 單列定義長度總和 (bytes) |
搭配未文件化預存程序 sp_MSforeachdb:
EXEC sp_MSforeachdb @command1 = '
USE [?];
IF DB_ID() > 4 -- 排除 system DB
BEGIN
-- 將上述查詢放入這裡,或插入暫存表彙總
END
';
注意:
sp_MSforeachdb參數@command1長度限制NVARCHAR(2000),複雜查詢建議寫成預存程序再呼叫,或改用sys.databases游標迴圈更可控。
dbo.TableSizeHistory 存放每日快照。TrackingUTCTime。WITH (NOLOCK) 避免封鎖,接受髒讀風險(統計用途可接受)。sys.dm_db_partition_stats 配合 sys.tables 更簡潔。