在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;
这些查询将返回每个表的总大小、已用空间和未用空间。如果你只想看到数据大小,确保在查询中过滤掉索引大小或只选择堆(没有索引)的行。
对于大型数据库,这些查询可能会花费一些时间来执行,因为它们需要遍历大量的系统视图和表。在生产环境中执行这类查询之前,请确保你有足够的权限,并且了解其对性能的影响。在非高峰时段执行这些操作通常是更好的选择。