在SQL Server中,你可以通過查詢系統視圖和系統表來獲取數據庫中每個表的大小。這可以通過幾種不同的方式來實現,下面是一些常用的方法:
方法1:使用sp_spaceused
存儲過程
sp_spaceused
是一個內置的存儲過程,可以用來顯示數據庫中每個表的空間使用情況,包括數據大小和索引大小。
EXEC sp_spaceused;
這將列出數據庫中所有用戶表的數據和索引大小。
方法2:查詢sys.dm_db_partition_stats
動態管理視圖
這個視圖提供了關于數據庫中每個表和索引分區的信息,包括數據大小和索引大小。
SELECT t.NAME AS TableName,s.Name AS SchemaName,p.rows AS RowCounts,SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 -- 非系統表
GROUP BY t.Name, s.Name, p.Rows
ORDER BY TotalSpaceKB DESC;
方法3:查詢sys.tables
和sys.partitions
結合使用
如果你只關心數據大小而不包括索引大小,可以結合使用sys.tables
和sys.partitions
。
SELECT t.NAME AS TableName,s.Name AS SchemaName,SUM(a.total_pages) * 8 AS TotalSpaceKB, SUM(a.used_pages) * 8 AS UsedSpaceKB, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,SUM(p.rows) AS RowCounts
FROM sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 -- 非系統表且非堆(非索引)數據大小計算用到的索引ID通常是1(堆)或0(堆以外的表)
GROUP BY t.Name, s.Name, p.Rows;
這些查詢將返回每個表的總大小、已用空間和未用空間。如果你只想看到數據大小,確保在查詢中過濾掉索引大小或只選擇堆(沒有索引)的行。
對于大型數據庫,這些查詢可能會花費一些時間來執行,因為它們需要遍歷大量的系統視圖和表。在生產環境中執行這類查詢之前,請確保你有足夠的權限,并且了解其對性能的影響。在非高峰時段執行這些操作通常是更好的選擇。