在SQL Server的实际使用中,统计表的总行数是非常常见的需求,比如做数据量监控、分页逻辑校验、数据迁移前的规模评估等场景都会用到。当表的数据量达到百万甚至千万级别时,使用SELECT COUNT(*)的方式会触发全表扫描,执行时间会非常长,还会占用大量的IO和CPU资源,对生产业务的性能造成影响。而通过查询sys.partitions系统表获取行数,是SQL Server官方提供的高效方案,它直接读取系统存储的元数据,不需要扫描实际的数据页,执行速度极快。

sys.partitions系统表的基本介绍
sys.partitions是SQL Server中存储表或索引每个分区信息的系统目录视图,每个表或索引的每个分区在sys.partitions中都会对应一行记录。其中和行数统计最相关的字段有两个:
- object_id:对应表或索引所属对象的ID,和sys.objects系统表的object_id关联,可以定位到具体的表
- rows:该分区中存储的大致行数,是SQL Server维护的元数据信息,对于堆表(没有聚集索引的表)和聚集索引的分区,这个数值就是该分区的行数
需要注意的是,sys.partitions中的rows字段是近似值,不是实时的精确值,但是在绝大多数业务场景下,这个近似值的精度已经足够使用,而且它的获取效率远高于全表扫描。
通过sys.partitions统计表行数的具体实现
1. 统计单个表的行数
要统计指定表的行数,只需要关联sys.objects和sys.partitions,筛选目标表的对象类型,然后累加rows字段即可。以下是统计名为TestTable的表的总行数的示例代码:
-- 统计TestTable表的总行数
SELECT
o.name AS 表名,
SUM(p.rows) AS 总行数
FROM
sys.objects o
INNER JOIN
sys.partitions p ON o.object_id = p.object_id
WHERE
o.name = 'TestTable' -- 替换为实际需要统计的表名
AND o.type = 'U' -- 筛选用户表,排除系统表
AND p.index_id IN (0, 1) -- 0代表堆表的行,1代表聚集索引的行,排除非聚集索引的重复统计
GROUP BY
o.name;
代码中的index_id筛选条件非常重要,因为非聚集索引在sys.partitions中也会有一条记录,如果不加这个筛选,会把非聚集索引的行数也累加进去,导致统计结果偏大。index_id为0表示堆表的分区,index_id为1表示聚集索引的分区,每个表只会有一个堆或者一个聚集索引,所以累加这两个index_id对应的rows就能得到正确的总行数。
2. 批量统计所有用户表的行数
如果需要一次性统计数据库中所有用户表的行数,只需要去掉表名的筛选条件即可,代码如下:
-- 批量统计所有用户表的行数
SELECT
o.name AS 表名,
SUM(p.rows) AS 总行数
FROM
sys.objects o
INNER JOIN
sys.partitions p ON o.object_id = p.object_id
WHERE
o.type = 'U' -- 筛选用户表
AND p.index_id IN (0, 1) -- 排除非聚集索引
GROUP BY
o.name
ORDER BY
SUM(p.rows) DESC; -- 按行数从大到小排序
不同表行数统计方式的对比
为了更清晰地了解查询sys.partitions方式的优势,我们将它和常见的两种行数统计方式做对比:
| 统计方式 | 执行效率 | 资源占用 | 结果精度 | 适用场景 |
|---|---|---|---|---|
| SELECT COUNT(*) | 低,数据量越大越慢 | 高,全表扫描占用IO和CPU | 精确 | 小表、需要精确行数的场景 |
| sp_spaceused 存储过程 | 中等 | 中等 | 近似 | 需要同时获取表空间占用信息的场景 |
| 查询sys.partitions系统表 | 极高,毫秒级返回 | 极低,只读取元数据 | 近似 | 大表、生产环境、批量统计场景 |
注意事项
- sys.partitions中的rows字段是元数据的缓存值,不是实时更新的,如果你刚对表做了大量插入、删除操作,可能需要执行UPDATE STATISTICS 表名来更新统计信息,才能让rows字段的值更准确
- 对于分区表,sys.partitions会为每个分区生成一条记录,上面的SUM逻辑会自动累加所有分区的行数,不需要额外处理
- 如果需要获取精确的行数,尤其是刚做过大量数据变更的场景,还是建议使用SELECT COUNT(*),但是要避免在生产业务高峰期对大表执行这个操作
查询sys.partitions系统表是SQL Server中统计表行数的最优方案之一,在效率和资源占用上都有明显优势,开发者可以根据实际的业务需求选择合适的统计方式。
SQL_Serversys.partitions表行数统计系统表查询修改时间:2026-07-10 14:54:30