You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改MSSQL表统计查询语句以指定单表并获取更多统计信息

没问题,我帮你把原查询改成针对单表的版本,同时给你一些获取更多表统计信息的实用方法👇

修改后的单表统计查询语句

直接在原查询基础上添加WHERE子句过滤目标表即可,这里建议同时指定架构名(避免不同架构下同名表的歧义):

USE [mydbname]
GO
SELECT 
    s.Name AS SchemaName,
    t.Name AS TableName,
    p.rows AS RowCounts,
    CAST(ROUND((SUM(a.used_pages) / 128.00), 2) AS NUMERIC(36, 2)) AS Used_MB,
    CAST(ROUND((SUM(a.total_pages) - SUM(a.used_pages)) / 128.00, 2) AS NUMERIC(36, 2)) AS Unused_MB,
    CAST(ROUND((SUM(a.total_pages) / 128.00), 2) AS NUMERIC(36, 2)) AS Total_MB
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
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
-- 过滤指定表和架构
WHERE s.Name = N'YourSchemaName' 
  AND t.Name = N'YourTableName'
GROUP BY t.Name, s.Name, p.Rows
ORDER BY s.Name, t.Name
GO

提示:把[mydbname]、YourSchemaName、YourTableName替换成你实际的数据库名、架构名和表名即可。如果你的表默认在dbo架构下,架构名填dbo就行。


获取表额外统计信息的实用方法

除了基础的行数和空间,你还可以查询这些更细节的统计信息:

1. 用系统存储过程快速查看空间(最简单)

sp_spaceused是SQL Server自带的存储过程,返回的信息更简洁,还包含索引总大小:

USE [mydbname]
GO
EXEC sp_spaceused N'YourSchemaName.YourTableName';
GO

2. 查询索引的空间与碎片情况

如果想知道每个索引占用的空间,以及索引碎片率(用于优化查询性能),可以用这个查询:

USE [mydbname]
GO
SELECT
    s.Name AS SchemaName,
    t.Name AS TableName,
    i.Name AS IndexName,
    i.type_desc AS IndexType,
    CAST(ROUND((SUM(a.used_pages)/128.00),2) AS NUMERIC(36,2)) AS IndexUsed_MB,
    -- 计算索引碎片率(仅适用于非聚集索引)
    ROUND(ips.avg_fragmentation_in_percent, 2) AS Fragmentation_Percent
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
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), t.object_id, i.index_id, NULL, 'DETAILED') ips
WHERE s.Name = N'YourSchemaName' 
  AND t.Name = N'YourTableName'
GROUP BY s.Name, t.Name, i.Name, i.type_desc, ips.avg_fragmentation_in_percent
ORDER BY Fragmentation_Percent DESC;
GO

3. 查看表的列统计信息

了解SQL Server为表创建的统计信息(用于查询优化器生成执行计划):

USE [mydbname]
GO
SELECT
    s.Name AS SchemaName,
    t.Name AS TableName,
    st.Name AS StatisticName,
    sc.Name AS ColumnName,
    st.auto_created AS IsAutoCreated,
    st.last_updated AS LastUpdated
FROM sys.tables t
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sys.stats st ON t.object_id = st.object_id
INNER JOIN sys.stats_columns sc ON st.object_id = sc.object_id AND st.stats_id = sc.stats_id
INNER JOIN sys.columns c ON sc.object_id = c.object_id AND sc.column_id = c.column_id
WHERE s.Name = N'YourSchemaName' 
  AND t.Name = N'YourTableName'
ORDER BY st.last_updated DESC;
GO

4. 分区表的分区统计(如果表有分区)

如果你的表是分区表,可以查看每个分区的行数和空间占用:

USE [mydbname]
GO
SELECT
    s.Name AS SchemaName,
    t.Name AS TableName,
    p.partition_number AS PartitionNumber,
    p.rows AS PartitionRowCounts,
    CAST(ROUND((SUM(a.used_pages)/128.00),2) AS NUMERIC(36,2)) AS PartitionUsed_MB,
    CAST(ROUND((SUM(a.total_pages)/128.00),2) AS NUMERIC(36,2)) AS PartitionTotal_MB
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
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE s.Name = N'YourSchemaName' 
  AND t.Name = N'YourTableName'
GROUP BY s.Name, t.Name, p.partition_number, p.rows
ORDER BY p.partition_number;
GO

内容的提问来源于stack exchange,提问作者600vka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:54:54