如何在SQL Server中自动统计指定架构下各表的行数?
SQL Server中按架构自动统计所有表行数的方案
当然有更高效的方案,不用手动导出表列表再用Excel生成语句,只需要指定架构名,就能自动统计该架构下所有表的行数,返回表名和对应行数的结果集。给你两种实用方案:
方案一:高效获取近似行数(推荐,速度极快)
利用SQL Server的系统统计信息来获取行数,不需要扫描全表,适合快速了解数据量级:
DECLARE @SchemaName NVARCHAR(128) = '你的架构名' -- 替换成目标架构名 SELECT t.name AS 表名, SUM(p.rows) AS 行数 FROM sys.schemas s JOIN sys.tables t ON s.schema_id = t.schema_id JOIN sys.indexes i ON t.object_id = i.object_id JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id WHERE s.name = @SchemaName AND i.index_id IN (0, 1) -- 0=堆表,1=聚集索引,只统计主数据分区 GROUP BY t.name ORDER BY 行数 DESC
说明:
- 这个方法依赖系统分区统计数据,行数是近似值,和实际可能有少量偏差
- 如果需要更接近实际值,可以先执行
UPDATE STATISTICS 表名更新统计信息,再运行上面的脚本
方案二:精确统计行数(适合需要准确数字的场景)
通过动态SQL自动生成每个表的COUNT(*)语句并执行,结果完全准确,但大表较多时执行速度会很慢:
DECLARE @SchemaName NVARCHAR(128) = '你的架构名' -- 替换成目标架构名 DECLARE @DynamicSQL NVARCHAR(MAX) = '' SELECT @DynamicSQL += 'SELECT ''' + t.name + ''' AS 表名, COUNT(*) AS 行数 FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' UNION ALL ' FROM sys.schemas s JOIN sys.tables t ON s.schema_id = t.schema_id WHERE s.name = @SchemaName -- 去掉最后多余的UNION ALL SET @DynamicSQL = LEFT(@DynamicSQL, LEN(@DynamicSQL) - 10) EXEC sp_executesql @DynamicSQL
说明:
QUOTENAME函数用来处理表名或架构名包含特殊字符的情况,避免语法错误- 大表执行
COUNT(*)会扫描全表,耗时较长,建议在业务低峰期运行
内容的提问来源于stack exchange,提问作者Ashutosh Mahato
相关产品推荐
相关产品推荐

