MS-SQL如何通过Select命令查询数据库各表的行数与对应列数
MS SQL Server 查询各表列数与行数实现方案
MS SQL Server 的 INFORMATION_SCHEMA.TABLES 系统视图未内置 TABLE_ROWS 字段(该字段为 MySQL 等其他数据库的实现),可通过以下两种方案实现需求:
方案1:系统视图快速统计(性能优先)
通过sys.tables、sys.partitions系统视图读取存储引擎缓存的行数,性能远高于逐表执行COUNT(*),仅存在极低的统计误差,适合大库快速统计场景:
SELECT SCHEMA_NAME(t.schema_id) AS TABLE_SCHEMA, t.name AS TABLE_NAME, -- 统计对应表的列数 ( SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = t.name AND c.TABLE_SCHEMA = SCHEMA_NAME(t.schema_id) ) AS COLUMN_COUNT, -- 统计对应表的行数,仅统计堆/聚集索引分区避免重复计数 SUM(p.rows) AS ROW_COUNT FROM sys.tables t INNER JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id IN (0,1) GROUP BY t.schema_id, t.name ORDER BY ROW_COUNT DESC
注意:如果你的库中不存在多schema隔离的情况,可删除schema相关的判断逻辑。
方案2:动态SQL精确统计(精度优先)
如果需要事务级100%准确的实时行数,可通过动态SQL逐表执行COUNT(*)实现:
DECLARE @sql NVARCHAR(MAX) = N'' -- 拼接所有表的查询逻辑 SELECT @sql += N'UNION ALL SELECT ''' + SCHEMA_NAME(schema_id) + N''' AS TABLE_SCHEMA, ''' + name + N''' AS TABLE_NAME, ( SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = ''' + name + ''' AND c.TABLE_SCHEMA = ''' + SCHEMA_NAME(schema_id) + ''' ) AS COLUMN_COUNT, COUNT(*) AS ROW_COUNT FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + N'.' + QUOTENAME(name) + N' ' FROM sys.tables -- 移除开头多余的UNION ALL,拼接排序逻辑 SET @sql = STUFF(@sql, 1, 10, N'') + N' ORDER BY ROW_COUNT DESC' -- 执行动态SQL EXEC sp_executesql @sql
注意:库中表数据量较大时执行速度较慢,请勿在生产业务高峰时段执行。
内容的提问来源于stack exchange,提问作者user9715288
相关产品推荐
相关产品推荐

