Sql server 查询每个表大小

发布于:2025-08-18 ⋅ 阅读:(18) ⋅ 点赞:(0)

在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.tablessys.partitions结合使用

如果你只关心数据大小而不包括索引大小,可以结合使用sys.tablessys.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;
  • 这些查询将返回每个表的总大小、已用空间和未用空间。如果你只想看到数据大小,确保在查询中过滤掉索引大小或只选择堆(没有索引)的行。

  • 对于大型数据库,这些查询可能会花费一些时间来执行,因为它们需要遍历大量的系统视图和表。在生产环境中执行这类查询之前,请确保你有足够的权限,并且了解其对性能的影响。在非高峰时段执行这些操作通常是更好的选择。


网站公告

今日签到

点亮在社区的每一天
去签到