参考sql2012存储过程写的统计所有用户表尺寸大小的示例


在SQL Server 2012中,统计所有用户表尺寸大小(包括数据大小和索引大小)的一个常见方法是通过查询系统视图和动态管理视图。以下是一个示例SQL脚本,用于统计所有用户表的总大小,包括其数据占用空间和索引占用空间:


-- 声明一个表变量来存储结果
DECLARE @Result TABLE (
    TableName NVARCHAR(256),
    TotalSpaceMB FLOAT,
    DataSpaceMB FLOAT,
    IndexSpaceMB FLOAT
)

-- 插入每个用户表的统计数据
INSERT INTO @Result
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 DataSpaceKB,
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS IndexSpaceKB
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

-- 将KB转换为MB并输出
SELECT 
    TableName,
    TotalSpaceMB = CAST(TotalSpaceKB / 1024.0 AS DECIMAL(10, 2)),
    DataSpaceMB = CAST(DataSpaceKB / 1024.0 AS DECIMAL(10, 2)),
    IndexSpaceMB = CAST(IndexSpaceKB / 1024.0 AS DECIMAL(10, 2))
FROM 
    @Result

**注意**:

- 这个查询计算了每个表的总空间、数据空间和索引空间,并以KB为单位展示。在SELECT语句的最后,我使用了CAST函数将KB转换为MB,以便更易于阅读。

- `sys.tables`用于获取所有用户表(通过`is_ms_shipped = 0`和`OBJECT_ID > 255`排除系统表)。

- `sys.indexes`、`sys.partitions`和`sys.allocation_units`用于获取每个索引的分区信息和分配单元信息,这些信息用于计算总空间、数据空间和索引空间。

- `SUM(a.total_pages) * 8`、`SUM(a.used_pages) * 8`中的`* 8`是因为SQL Server中每页的大小是8KB。

- 查询结果存储在表变量`@Result`中,并在最后以MB为单位进行选择和展示。

这个脚本应该满足您统计SQL Server 2012中所有用户表尺寸大小的需求。