select count(*) from TableName
VS
select rows from sys.partitions where object_id = object_id('TableName') and index_id = 1
针对百万级的表进行返回表的记录数时,两种写法的速度差距还是显而易见的。
1、count(*)函数需要进行一次完整的索引/表扫描,才能返回表的记录总数。这样会及其影响数据库的性能。
2、而sys.partitions 视图包含了数据库中所有表和索引的每个分区在表中对应的每一行,即使所有表和索引并未显式分区,也至少在这个视图中包含一个分区。
sys.partitions (Transact-SQL)
数据库中所有表和索引的每个分区在表中各对应一行。即使 SQL Server 2005 中的所有表和索引并未显式分区,也认为它们至少包含一个分区。
列名 | 数据类型 | 说明 |
---|---|---|
partition_id | bigint | 分区的 ID。在数据库中是唯一的。 |
object_id | int | 此分区所属的对象的 ID。每个表或视图都至少包含一个分区。 |
index_id | int | 此分区所属的对象内的索引的 ID。 |
partition_number | int | 所属索引或堆中的从 1 开始的分区号。对于未分区的表和索引,此列的值为 1。 |
hobt_id | bigint | 包含此分区的行的数据堆或 B 树的 ID。 |
rows | bigint | 此分区中的大约行数。 |
引自:Transact-SQL 帮助