关于SQL SERVER中表记录数统计方法的探究
关于统计MSSQL表中记录数,常用的方法如下(blogs为假设表):
SELECT COUNT(0) FROM dbo.blogs WITH(NOLOCK)
当dbo.blogs表中的记录数较少时,以下是其执行计划:
由此可见,当记录数较少时,这样查询是很快的,继续往下看:
当我将数据量增加到10万级别的时候执行如下查询:
SELECT COUNT(0) FROM dbo.blogs WITH(NOLOCK)
可见随着记录数的不断增加,其时间直线上升。
如果对记录数要求不是特别精确,完全有一种替代的方法,以下分析三个系统视图,以及微软给出的解释:
sys.objects sys.partitions sys.indexes
sys.objects:在数据库中创建的每个用户定义的架构范围内的对象在该表中均对应一行。其中包含name object_id列
sys.partitions:数据库中所有表和索引的每个分区在表中各对应一行。SQL Server 2008 中所有表和索引都至少包含一个分区,无论它们是否已进行显式分区均为如此。
sys.indexes:每个表格对象(例如,表、视图或表值函数)的索引或堆都包含一行。
查询语句如下:
代码SELECT tbl.name AS [Name]
,tbl.object_id AS [ID]
,spart.[rows] AS [RowCount]
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS idx
ON idx.object_id = tbl.object_id
AND idx.index_id<2
LEFT JOIN sys.partitions spart
ON spart.object_id = tbl.object_id AND spart.index_id<2
WHERE (
tbl.name=N'Blog'
--AND SCHEMA_NAME(tbl.schema_id)=N'dbo'
)
,tbl.object_id AS [ID]
,spart.[rows] AS [RowCount]
FROM sys.tables AS tbl
INNER JOIN sys.indexes AS idx
ON idx.object_id = tbl.object_id
AND idx.index_id<2
LEFT JOIN sys.partitions spart
ON spart.object_id = tbl.object_id AND spart.index_id<2
WHERE (
tbl.name=N'Blog'
--AND SCHEMA_NAME(tbl.schema_id)=N'dbo'
)
经大数据量的测试,该方法也能较快统计记录数量,从其执行计划中也可以看出,基本不受数据量多少的影响, 只是官方用的大约来表明其统计不够精确,实际测试中也发现了该问题,几十万级别的数据,有可能相差几个数据,但是其对于不是特别精确的需求来说,还是能高性能的满足要求的。


浙公网安备 33010602011771号