1.查询当前数据库中所有用户表的数据量(即每个表的记录数)
SELECT a.name , b.rows FROM sysobjects AS a
INNER JOIN sysindexes AS b ON a.id = b.id
WHERE ( a.type = 'u' ) AND ( b.indid IN ( 0, 1 ) )
ORDER BY b.rows DESC
或
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
sys.partitions p ON t.object_id = p.object_id
WHERE
p.index_id IN (0, 1) -- 0 = heap table, 1 = clustered index
GROUP BY
t.Name, s.Name, p.Rows
ORDER BY
p.rows DESC;
说明:
sys.tables:获取数据库中所有用户表。
sys.partitions:每个表(或分区)在物理存储层面的分区信息,包含记录数(rows)。
index_id IN (0, 1):过滤掉非主数据行的分区(如非聚集索引的副本)。
2.在1的基础上增加显示数据库名
SELECT
DB_NAME() AS DatabaseName,
t.NAME AS TableName,
s.Name AS SchemaName,
SUM(p.rows) AS RowCounts
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
sys.partitions p ON t.object_id = p.object_id
WHERE
p.index_id IN (0, 1)
GROUP BY
t.Name, s.Name
ORDER BY
RowCounts DESC;
3.跨所有数据库查询每个数据库中每张表的数据量(行数)
需要跨多个数据库查,可以使用 sp_MSforeachdb 或手动遍历数据库执行2中语句。
跨所有数据库查询每个数据库中每张表的数据量(行数),使用 sp_MSforeachdb 系统存储过程完成:
EXEC sp_MSforeachdb N'
USE [?];
IF DB_ID() NOT IN (1, 2, 3, 4) -- 排除系统数据库(master, tempdb, model, msdb)
BEGIN
PRINT ''Database: [?]'';
SELECT
DB_NAME() AS DatabaseName,
s.name AS SchemaName,
t.name AS TableName,
SUM(p.rows) AS RowCounts
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
sys.partitions p ON t.object_id = p.object_id
WHERE
p.index_id IN (0, 1)
GROUP BY
s.name, t.name
ORDER BY
RowCounts DESC;
END
';
说明:
sp_MSforeachdb:遍历所有数据库。
USE [?]:在遍历时切换数据库上下文。
IF DB_ID() NOT IN (...):排除系统数据库。
每个数据库都会输出一个标题,然后列出其所有表及记录数。
注意事项:该语句需以 sa 或具有跨库权限的账户执行。
sp_MSforeachdb 是未文档化的存储过程,虽然广泛使用但微软不推荐用于关键任务。如果需要更稳健的版本可考虑自己实现游标版本。