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 是未文档化的存储过程,虽然广泛使用但微软不推荐用于关键任务。如果需要更稳健的版本可考虑自己实现游标版本。
总结
到此这篇关于sql server查询所有表数据量的文章就介绍到这了,更多相关sqlserver查询所有表数据量内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论